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

时间:2012-12-01 05:23:15

标签: c++ regex boost-regex

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

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

要理解它,我将其分为以下部分

  • , =匹配包含,

  • 的所有内容
  • (?= =后跟

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

  • (?![^\"]*\") =但未发送任何不"且匹配"

  • 的内容

换句话说,匹配,后跟11111"111" OR后跟""

的所有内容

使用上述表达式的用例,仅用于对字符串进行标记,由,分隔,但我假设作者为某些更通用的东西而构建。

任何人都可以提供比上述更简单的解释吗?

上面的表达式用于为boost :: regex()指定表达式。

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

  1. 可以使用偶数“跟着逗号

  2. 但是,单词“跟着逗号

  3. 是不可行的

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

    第一个“,”匹配,因为它具有以下偶数“(”h,w“)

    “h,w”之间的第二个“,”是不匹配的,因为第二个表达式(?![^ \“] * \”)表示“,”不应该后跟一个“

    最后,最后一个“,”匹配。

    最终输出为2,

1 个答案:

答案 0 :(得分:2)

它看起来会匹配任何逗号,但只有在逗号后面有偶数"个字符时才会匹配。

, - 逗号。

(?= - 跟着......

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

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

)关闭(?=

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

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

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