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

时间:2020-06-01 12:01:22

标签: regex pcre

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

2 个答案:

答案 0 :(得分:1)

1选项可以使用if/else clause,这将在第2组中标记,在wilson中在第3组中标记。对于组1。

"

Regex demo

如果名字后面的空格不应该存在,您也可以将其分组并在组3和4中包含值。

\w+:(")?(\w+(?:\h+(\w+))?)(?(1)")

Regex demo

您还可以获取引号之间的单个值,也可以使用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+)关闭分支重置组

Regex demo

答案 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组,等等。
相关问题