我正在尝试在搜索中实现gmail样式过滤器,但我被困在这个正则表达式问题上。我需要在引号中捕获一个单词或两个单词(但没有引号本身(这是 PCRE (PHP(
即。
name:mark
期望的结果:第一个捕获组应标记为
name:"mark"
期望的结果:第一个捕获组应标记为
name:"mark wilson"
期望结果:第一个捕获组应该是标记,第二个捕获组应该是威尔逊
name:mark wilson
期望的结果:第一个捕获组应该是马克,威尔逊被忽略
我得到的最接近的是 name:(\w+|\"\w+(?>\"|\s([a-z.'-]+\"((( 它完美地捕获了示例 1,但示例 2 仍然包含引号,示例 3 最终为:
第1组:"马克·威尔逊"(包括引号(
第2组:威尔逊"(包括引用(
我已经尝试了前瞻和回望,但我也没有取得任何进展
任何帮助将不胜感激。 蒂亚
1 选项可以使用 if/else 子句,该子句将在组 2 中给出标记,在第 3 组中给出 Wilson。第一组将捕获可用于 if else 检查组 1 是否存在的"
。
w+:(")?(w+(?:h+(w+))?)(?(1)")
正则表达式演示
如果名字后面的空格不应该存在,您也可以将其分组并让值位于第 3 组和第 4 组中
w+:(")?((w+)(?:h+(w+))?)(?(1)")
正则表达式演示
您还可以获取引号之间的单个值,或者使用分支重置组捕获捕获组中的第一个或第二个名称
w+:(?|"(w+)(?:h+(w+))?"|(w+))
解释
w+:
匹配 1+ 单词字符(?|
分支重置组"(w+)
捕获组 1,匹配 1+ 单词字符(?:
非捕获组h+
匹配 1+ 水平空格字符(w+)
捕获组 2,匹配 1+ 单词字符
)?
关闭组并设为可选"
比赛"
|
或(w+)
捕获组 1,匹配 1+ 单词字符
)
关闭分支重置组
正则表达式演示
重点是不能对任意数量的组执行此操作,必须在设计时在模式中指定它们。
您可以将这样的模式与分支重置组一起使用:
w+:(?|(w+)|"(w+)(?:h+(w+))?(?:h+(w+))?")
请参阅正则表达式演示。在末尾添加更多(?: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 组等。