[我正在尝试在搜索中实现gmail样式过滤器,但我遇到了这个正则表达式问题。我需要在引号中捕获一个单词或两个单词(但本身不带引号),这是PCRE(PHP)
即
name:mark
所需结果:第一个捕获组应为标记
name:"mark"
所需结果:第一个捕获组应为标记
name:"mark wilson"
期望的结果:第一个捕获组应该是标记,第二个捕获组应该是威尔逊
name:mark wilson
所需结果:第一个捕获组应为标记,将忽略威尔逊
我得到的最接近的名字是:(\ w + | \“ \ w +(?> \” | \ s([az .'-] + \“))))它完美地捕获了示例1,但示例2仍然存在包括引号,示例3最终显示为:
第1组:“马克·威尔逊”(包括引号)
第2组:威尔逊”(包括引号)
我已经尝试了超前和往后看,但无论如何我都无济于事
任何帮助将不胜感激。 tia
要点是,您不能对任意数量的组执行此操作,必须在设计时在模式中全部指定它们。
您可以在branch reset group中使用这样的模式:
\w+:(?|(\w+)|"(\w+)(?:\h+(\w+))?(?:\h+(\w+))?")
请参见regex demo。最后添加更多(?:\h+(\w+))?
模式以支持最多N个可选单词。
详细信息
\w+:
-1+个单词字符,然后是:
] >>(?|(\w+)|"(\w+)(?:\h+(\w+))?(?:\h+(\w+))?")
-分支重置组,其中组共享相同的ID:(\w+)
-组1:一个或多个单词字符]|
-或"(\w+)(?:\h+(\w+))?(?:\h+(\w+))?"
-"
-一个"
字符(\w+)
-组1:一个或多个单词字符](?:\h+(\w+))?
-序列的可选出现:\h+
-1个或更多水平空白](\w+)
-第2组:一个或多个单词字符(?:\h+(\w+))?"
-同上,但第3组,依此类推]1选项可以使用if/else clause,它将在组2中标记,在威尔逊中将在组3中标记。第一个组将捕获"
,该C0可以用于检查组1是否存在。 >
\w+:(")?(\w+(?:\h+(\w+))?)(?(1)")