需要解释这个正则表达式

时间:2014-11-07 21:01:32

标签: regex

我有这个正则表达式用于分割字符串:

,(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)

e.g。串

“字段1”, “字段2”, “ITEM1,ITEM2,项目3”, “您好”, “约翰” “”

我理解的一件事是将字符串分开,但之后的任何事情我都不确定。

如果有人能解释这个正则表达式请。

如果你能将它解剖到最简单的水平,我将不胜感激。

2 个答案:

答案 0 :(得分:4)

此正则表达式仅匹配逗号, 时,只有在双引号之外才能通过计算文字,之后的偶数引号来匹配。


<强>解释

, -> match literal comma
(?=...) -> positive lookahead
[^"]*" -> match anything before a " followed by a literal "
[^"]*"[^"]*" -> match a pair of above 
(?:[^"]*"[^"]*")* -> Match 0 or more of pairs (0, 2, 4, 6 sets)
[^"]*$ -> Followed by any non-quote till end of string

示例输入:

"Field1,Field2","Field3","item1,item2,item3"
  • 首先它会在,之前与"Field3"匹配,因为前瞻:(?=(?:[^"]*"[^"]*")*[^"]*$)确保此逗号后有4个双引号。
  • 第二,它会在,之后与"Field3"匹配,因为前瞻:(?=(?:[^"]*"[^"]*")*[^"]*$)确保此逗号后有两个双引号。
  • 它与Field1Field2之间的逗号不匹配,因为之后的引号数在数字上是奇数,因此预告(?=(?:[^"]*"[^"]*")*[^"]*$)将会失败。

答案 1 :(得分:3)

,(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)

这不会在,"内的"上分开。这表示在每,之后会有something " something"组。所以有效,不能介于""之间。