Regex捕获一个单词或两个引号中的单词

问题描述 投票:0回答:2

[我正在尝试在搜索中实现gmail样式过滤器,但我遇到了这个正则表达式问题。我需要在引号中捕获一个单词或两个单词(但本身不带引号),这是PCRE(PHP)

name:mark

所需结果:第一个捕获组应为标记

name:"mark"

所需结果:第一个捕获组应为标记

name:"mark wilson"

期望的结果:第一个捕获组应该是标记,第二个捕获组应该是威尔逊

name:mark wilson

所需结果:第一个捕获组应为标记,将忽略威尔逊

我得到的最接近的名字是:(\ w + | \“ \ w +(?> \” | \ s([az .'-] + \“))))它完美地捕获了示例1,但示例2仍然存在包括引号,示例3最终显示为:

第1组:“马克·威尔逊”(包括引号)

第2组:威尔逊”(包括引号)

我已经尝试了超前和往后看,但无论如何我都无济于事

任何帮助将不胜感激。 tia

regex pcre
2个回答
0
投票

要点是,您不能对任意数量的组执行此操作,必须在设计时在模式中全部指定它们。

您可以在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组,依此类推]

0
投票

1选项可以使用if/else clause,它将在组2中标记,在威尔逊中将在组3中标记。第一个组将捕获",该C0可以用于检查组1是否存在。 >

\w+:(")?(\w+(?:\h+(\w+))?)(?(1)")
© www.soinside.com 2019 - 2024. All rights reserved.