我正在尝试在搜索中实现gmail样式过滤器,但我陷入了这个正则表达式问题。我需要在引号中捕获一个单词或两个单词(但本身不带引号),这是PCRE(PHP)
即。
name:mark
所需结果:第一个捕获组应为标记
name:"mark"
所需结果:第一个捕获组应为标记
name:"mark wilson"
期望的结果:第一个捕获组应为mark,第二个捕获组应为wilson
name:mark wilson
理想结果:第一个捕获组应该被标记,威尔逊被忽略
我得到的最接近的名字是:(\ w + | \“ \ w +(?> \” | \ s([az .'-] + \“)))它完美地捕获了示例1,但是示例2仍然包含引号,示例3最终显示为:
第1组:“马克·威尔逊”(包括引号)
第2组:威尔逊”(包括引号)
我已经尝试了超前和后退,但无论如何我都无法做到
任何帮助将不胜感激。 tia
答案 0 :(得分:1)
1选项可以使用if/else clause,这将在第2组中标记,在wilson中在第3组中标记。对于组1。
"
如果名字后面的空格不应该存在,您也可以将其分组并在组3和4中包含值。
\w+:(")?(\w+(?:\h+(\w+))?)(?(1)")
您还可以获取引号之间的单个值,也可以使用branch reset group
来获取捕获组中的名字或名字。\w+:(")?((\w+)(?:\h+(\w+))?)(?(1)")
说明
\w+:(?|"(\w+)(?:\h+(\w+))?"|(\w+))
匹配1个以上的字符字符\w+:
分支重置组
(?|
捕获组1,匹配1个以上的字符字符"(\w+)
非捕获组
(?:
匹配1个以上水平空格字符\h+
捕获第2组,匹配1个以上的字符字符(\w+)
关闭组并设为可选)?
匹配"
"
或|
捕获组1,匹配1个以上的字符字符(\w+)
关闭分支重置组答案 1 :(得分:1)
主要要点是您不能对任意数量的组执行此操作,必须在设计时在模式中全部指定它们。
您可以在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组,等等。