gpt4 book ai didi

用于分割 CSV 的正则表达式

转载 作者:行者123 更新时间:2023-12-02 15:14:02 25 4
gpt4 key购买 nike

我知道这个(或类似的)已被问过很多次,但在尝试了多种可能性后,我一直无法找到 100% 有效的正则表达式。

我有一个 CSV 文件,我试图将其拆分为一个数组,但遇到两个问题:引号逗号和空元素。

CSV 看起来像:

123,2.99,AMO024,Title,"Description, more info",,123987564

我尝试使用的正则表达式是:

thisLine.split(/,(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))/)

唯一的问题是,在我的输出数组中,第 5 个元素显示为 123987564,而不是空字符串。

最佳答案

描述

我认为简单地执行匹配并处理所有找到的匹配项会更容易,而不是使用拆分。

这个表达式将:

  • 用逗号分隔示例文本
  • 将处理空值
  • 将忽略双引号逗号,前提是双引号未嵌套
  • 从返回值中删除分隔逗号
  • 从返回值中删除周围的引号
  • 如果字符串以逗号开头,则第一个捕获组将返回空值

正则表达式:(?:^|,)(?=[^"]|(")?)"?((?(1)[^"]*|[^,"]*)) “?(?=,|$)

enter image description here

示例

示例文本

123,2.99,AMO024,Title,"Description, more info",,123987564

使用非 Java 表达式的 ASP 示例

Set regEx = New RegExp
regEx.Global = True
regEx.IgnoreCase = True
regEx.MultiLine = True
sourcestring = "your source string"
regEx.Pattern = "(?:^|,)(?=[^""]|("")?)""?((?(1)[^""]*|[^,""]*))""?(?=,|$)"
Set Matches = regEx.Execute(sourcestring)
For z = 0 to Matches.Count-1
results = results & "Matches(" & z & ") = " & chr(34) & Server.HTMLEncode(Matches(z)) & chr(34) & chr(13)
For zz = 0 to Matches(z).SubMatches.Count-1
results = results & "Matches(" & z & ").SubMatches(" & zz & ") = " & chr(34) & Server.HTMLEncode(Matches(z).SubMatches(zz)) & chr(34) & chr(13)
next
results=Left(results,Len(results)-1) & chr(13)
next
Response.Write "<pre>" & results

使用非 java 表达式进行匹配

第 0 组获取包含逗号的整个子字符串
如果使用,第 1 组将获得报价
第 2 组获取不包含逗号的值

[0][0] = 123
[0][1] =
[0][2] = 123

[1][0] = ,2.99
[1][1] =
[1][2] = 2.99

[2][0] = ,AMO024
[2][1] =
[2][2] = AMO024

[3][0] = ,Title
[3][1] =
[3][2] = Title

[4][0] = ,"Description, more info"
[4][1] = "
[4][2] = Description, more info

[5][0] = ,
[5][1] =
[5][2] =

[6][0] = ,123987564
[6][1] =
[6][2] = 123987564

已编辑

正如 Boris 指出的那样,CSV 格式会将双引号 " 转义为双双引号 ""。尽管 OP 中未包含此要求,但如果您的文本包含双引号,那么您将需要使用此修改后的表达式:

正则表达式:(?:^|,)(?=[^"]|(")?)"?((?(1)(?:[^"]|"")*|[ ^,"]*))"?(?=,|$)

另请参阅:https://regex101.com/r/y8Ayag/1

还应该指出的是,Regex 是一个模式匹配工具而不是解析引擎。因此,如果您的文本包含双双引号,则在模式匹配完成后,它仍将包含双双引号。使用此解决方案,您仍然需要搜索双双引号并在捕获的文本中替换它们。

关于用于分割 CSV 的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18144431/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com