【发布时间】:2020-06-01 12:01:22
【问题描述】:
我正在尝试在我的搜索中实现 gmail 样式过滤器,但我遇到了这个正则表达式问题。我需要在引号中捕获一个单词或两个单词(但没有引号本身)这是 PCRE (PHP)
即。
name:mark
期望的结果:第一个捕获组应该是标记
name:"mark"
期望的结果:第一个捕获组应该是标记
name:"mark wilson"
期望的结果:第一个捕获组应该是标记,第二个捕获组应该是 wilson
name:mark wilson
期望的结果:第一个捕获组应该是标记,威尔逊被忽略
我得到的最接近的是 name:(\w+|\"\w+(?>\"|\s([a-z.'-]+\"))) 它完美地捕获了示例 1,但示例 2仍然包括引号,示例 3 最终为:
第 1 组:“mark wilson”(包括引号)
第 2 组:wilson"(包括报价)
我已经尝试过前瞻和后瞻,但我也没有得到任何结果
任何帮助将不胜感激。 tia
【问题讨论】:
-
你可能想使用多重匹配,比如
(?:\G(?!\A)\h*"?|:"?)\K\w+,见this regex demo。 -
匹配项需要分组才能提取用于搜索目的。不幸的是,这不仅仅是布尔匹配操作的问题,否则这将起作用。
-
主要的一点是你不能对任意数量的组这样做,你必须在模式中指定它们。比如regex101.com/r/qm59Ae/2。您可以使用
\w+:(?|(\w+)|"(\w+)(?:\h+(\w+))?(?:\h+(\w+))?")并在末尾添加更多(?:\h+(\w+))?模式以支持最多 N 个可选单词 -
兄弟,我想你刚刚明白了。
\w+:(?|(\w+)|"(\w+)(?:\h+(\w+))?(?:\h+(\w+))?")似乎工作得很好@WiktorStribiżew 你能把这个作为答案发布吗?我会把它标记为正确的。