首页 > 解决方案 > 如何重复正则表达式的某些部分

问题描述

输入字符串是:

约翰的三明治好坏

表达 :

J.+(\'s|\') sandwich.* are (good|bad)

PHP代码:

preg_match_all("/ Expression /Us", Input string , $matches);

虽然它会在输入字符串中匹配'sgood,但我也想通过重复表达式的某些部分来匹配bad(good|bad) ,这将是.

我怎么能做这样的工作?

标签: phpregex

解决方案


您可以使用正则表达式:

.*?(\bgood\b|\bbad\b)\s?((?1))?

  • .*?懒惰地匹配任何东西。
  • (\bgood\b|\bbad\b)捕获组。捕获:

    • 字边界\b,后跟good,然后是字边界\b

    • |或者。

    • \b, 之后是bad, 之后是单词边界\b
  • \s?可选地匹配空格。
  • ((?1))?可选地递归第一个模式并在第二个捕获组中捕获。

你可以在这里测试这个正则表达式。

goodbad分别在捕获组一和二中捕获。


php片段:

<?php
$str = "John's sandwiches are good bad";
$re = "/.*?(\bgood\b|\bbad\b)\s?((?1))?/";
if (preg_match_all($re, $str, $matches)) {
    print_r($matches[1]);
    print_r($matches[2]);
}

推荐阅读