说明
我认为与其使用拆分,不如简单地执行匹配并处理所有找到的匹配项。
这个表达式将:
- 用逗号分隔示例文本
- 将处理空值
- 将忽略双引号逗号,前提是双引号不嵌套
- 从返回值中删除分隔逗号
- 从返回值中修剪周围的引号
- 如果字符串以逗号开头,则第一个捕获组将返回空值
正则表达式:(?:^|,)(?=[^"]|(")?)"?((?(1)[^"]*|[^,"]*))"?(?=,|$)
示例
示例文本
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 是一种模式匹配工具,而不是解析引擎。因此,如果您的文本包含双双引号,则在模式匹配完成后它仍将包含双双引号。使用此解决方案,您仍然需要搜索双双引号并在捕获的文本中替换它们。