我在工作中遇到了以下正则表达式。它做了什么?
,(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))
要理解它,我将其分为以下部分
,
=匹配包含,
(?=
=后跟
(?:[^\"]*\"[^\"]*\")*
=任何与"
不匹配的内容,后跟"
,后跟任何与"
不匹配的内容,后跟"
}。例如,1111“aaaaa”
(?![^\"]*\")
=但未发送任何不"
且匹配"
换句话说,匹配,
后跟11111"111"
OR后跟""
使用上述表达式的用例,仅用于对字符串进行标记,由,
分隔,但我假设作者为某些更通用的东西而构建。
任何人都可以提供比上述更简单的解释吗?
上面的表达式用于为boost :: regex()指定表达式。
更新: 实际上,它正在搜索“,”逗号,具有以下约束
可以使用偶数“跟着逗号
但是,单词“跟着逗号
例如,考虑字符串:a,“h,w”,23
第一个“,”匹配,因为它具有以下偶数“(”h,w“)
“h,w”之间的第二个“,”是不匹配的,因为第二个表达式(?![^ \“] * \”)表示“,”不应该后跟一个“
最后,最后一个“,”匹配。
最终输出为2,
答案 0 :(得分:2)
它看起来会匹配任何逗号,但只有在逗号后面有偶数"
个字符时才会匹配。
,
- 逗号。
(?=
- 跟着......
(?:[^\"]*\"[^\"]*\")*
- 任何以"
标记结尾且包含偶数总数"
标记或空字符串的字符串
(?![^\"]*\")
- 之后字符串中没有其他"
标记。
)
关闭(?=
。
如果我们已经知道整个输入字符串总共有"
个字符,那么这可能很有用,没有嵌套或转义引号之类的东西,引号之间的逗号不应该被视为分隔符。例如,给定输入
25,"Hello, world!","More text",123.45
正则表达式不应该与Hello和world之间的逗号匹配,但应与其他三个逗号匹配。