0

我在工作中遇到了以下正则表达式。它有什么作用?

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

为了理解它,我把它分成以下几个部分

  • ,=匹配所有有,

  • (?== 紧随其后

  • (?:[^\"]*\"[^\"]*\")*= 任何不匹配的内容",后跟",然后是任何不匹配的内容",然后是"。例如,1111"aaaaa"

  • (?![^\"]*\")= 但后面没有任何不"匹配的内容"

换句话说,匹配任何,后面跟着11111"111"OR 的东西""

使用上述表达式的用例,只是为了标记一个字符串,用 分隔,,但我假设作者是为一些更通用的东西而构建的。

谁能提供比上面更简单的解释?

上面的表达式用于将表达式分配给 boost::regex()。

更新:实际上,它正在搜索“,”逗号,具有以下约束

  1. 逗号后面可以有偶数个“”

  2. 但是,逗号后面不能有一个 "

例如考虑字符串:a, "h,w", 23

第一个 "," 匹配,因为它后面有偶数个 " ("h,w")

"h,w" 之间的第二个 "," 不匹配,因为第二个表达式 (?![^\"]*\") 指出 "," 后面不应跟一个 "

最后最后一个 "," 匹配。

最终输出为 2 , ,

4

1 回答 1

2

看起来它会匹配任何逗号,但前提是"该逗号后面有偶数个字符。

,- 一个逗号。

(?=- 其次是...

(?:[^\"]*\"[^\"]*\")*- 任何以"标记结尾并包含偶数个"标记的字符串,或空字符串,

(?![^\"]*\")"-后面的字符串中没有其他标记。

)关闭(?=.

如果我们已经知道整个输入字符串的"字符总数是偶数,没有嵌套或转义引号之类的东西,并且引号之间的逗号不应被视为分隔符,这可能很有用。例如,给定输入

25,"Hello, world!","More text",123.45

正则表达式不应匹配 Hello 和 world 之间的逗号,但应匹配其他三个逗号。

于 2012-12-01T05:44:47.693 回答