【问题标题】:Regex with pattern match before OR after in one regex?在一个正则表达式之前或之后具有模式匹配的正则表达式?
【发布时间】:2016-01-25 21:01:08
【问题描述】:

如果我在匹配中寻找锚词,例如句子中的单词颜色如果该句子中有颜色但匹配之前或之后都很好:

  • 红色
  • 红色

我可以用一个或两个正则表达式来做到这一点吗?我需要两个:

(Color (Red|Blue|Orange))

https://regex101.com/r/iT4nN6/1

((Red|Blue|Orange) Color)

https://regex101.com/r/iT4nN6/2

【问题讨论】:

  • 可能是(?|(Red|Blue|Orange) Color|Color (Red|Blue|Orange))?是为了 PCRE/Boost 吗?
  • @WiktorStribiżew 我认为这需要在末尾加上可选的开头?
  • 你能重新措辞吗?我只为支持分支重置的引擎建议了一个正则表达式。你的呢?这段代码是什么语言的?
  • 你能清楚地指定示例输入和输出吗?
  • @Szymon 我希望这会有所帮助:regex101.com/r/iT4nN6/5

标签: regex


【解决方案1】:

你可以做一个正则表达式:

((Red|Orange|Blue) Color|Color (Red|Orange|Blue)

如果事情变得更复杂,那么它会更难维护;您需要在两个地方更新颜色列表。根据您的具体情况,单独执行这两个组件可能更容易,仅在另一个结果中查找一个。

【讨论】:

    【解决方案2】:

    在 PHP PCRE 正则表达式语法中,您可以利用 (?J) 修饰符,让不同的捕获组使用相同的名称:

    (?J)(?<colorword>Color)\h+(?<color>Reddish|Red|Blue|Orange)|(?<color>Reddish|Red|Blue|Orange)\h+(?<colorword>Color)
    

    the regex demo

    PHP demo:

    $clrw = '(?<colorword>Color)';
    $clr = '(?<color>Reddish|Red|Blue|Orange)';
    $re = '~(?J)' . $clrw . '\h+' . $clrw . '|' . $clr . '\h+' . $clrw . '~i'; 
    $str = " I WANT TO EXTRACT CAPTURING GROUP 2 AS COLOR AND I DO:\nand  love the Color Red\n \nI WANT TO EXTRACT CAPTURING GROUP 2 AS COLOR BUT I DONT AS I HAVE TO REVERSE THE GROUPS TI ((Red|Blue|Orange) Color):\nit had a reddish color\n\nI DON'T WANT ANYTHING BECAUSE IT ISN'T PRECEDED OR FOLLOWED BY THE WORD COLOR\nit is a red dawn \nI took the red eye home\nit was the color red"; 
    preg_match_all($re, $str, $matches, PREG_SET_ORDER);
    for ($i = 0; $i < count($matches); $i++) {
        echo $matches[$i]["color"] . ": " . $matches[$i]["colorword"] . PHP_EOL;
    }
    

    结果:

    Red: Color
    reddish: color
    red: color
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-21
      • 1970-01-01
      • 1970-01-01
      • 2016-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多