我知道这个(或类似的)已经被问了很多次,但是尝试了许多可能性,我没有找到一个正常工作100%的正则表达式。
我有一个CSV文件,我试图将它拆分成一个数组,但遇到两个问题:引用逗号和空元素。
CSV看起来像:
123,2.99,AMO024,Title,"Description,more info",123987564
我试图使用的正则表达式是:
thisLine.split(/,(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))/)
唯一的问题是在我的输出数组中,第5个元素出现为123987564而不是一个空字符串。
描述
而不是使用分割,我认为简单地执行匹配并处理所有找到的匹配会更容易。
这个表达式将:
>在逗号分隔上划分示例文本
>将处理空值
>将忽略双引号逗号,提供双引号不嵌套
>从返回的值修剪定界逗号
>从返回值修剪周围的引号
正则表达式:(?:^ |,)(?= [^“] |(”)?“”((?(1)[^“] * | [^,”] *)) | $)
例
示例文本
123,123987564
ASP示例使用非java表达式
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] =,more info" [4][1] = " [4][2] = Description,more info [5][0] =,[5][1] = [5][2] = [6][0] =,123987564 [6][1] = [6][2] = 123987564