这个复杂的正则表达式做什么

what does this convoluted regex do

本文关键字:什么 正则表达式 复杂      更新时间:2023-10-16

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

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

为了理解它,我将其分为以下几个部分

  • ,=匹配所有具有,的内容

  • (?==后面跟着

  • (?:[^"]*"[^"]*")*=与"不匹配的任何内容,后面跟着",后面跟着与"不匹配的所有内容,后面跟"。例如,1111"aaaaa">

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

换句话说,匹配,后跟11111"111"""的任何内容

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

有人能提供比上面更简单的解释吗?

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

更新:实际上,它是在搜索","逗号,并带有以下约束

  1. 逗号后面有偶数"是可以的

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

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

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

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

最后一个","匹配。

最终输出为2,

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

,-逗号。

(?=-之后是…

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

(?![^"]*")-并且以后在字符串中没有其他"标记。

CCD_ 24关闭CCD_。

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

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

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