正则表达式 捕获一个单词或引号中的两个单词



我正在尝试在搜索中实现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 组等。

相关内容

  • 没有找到相关文章

最新更新