正则表达式:重新使用组内的模式在另一个组中使用

时间:2014-12-20 02:16:12

标签: regex

希望我能正确解释这一点。

是否可以重复使用我的常规部分重复使用正则表达式中的其他位置?例如,假设你有:\d{3}(可能要复杂得多。为了问题的目的,这很简单)你要用[a-zA-Z]{3,}或{{1的组合来测试它}}。这可以写成[\.a-zA-Z]{10}。但是,如果我希望再次使用它,也许在正则表达式中,是否可能或者必须重新编写此模式以便重新使用它。任何见解都将不胜感激。

3 个答案:

答案 0 :(得分:7)

如果您通过使用子模式(可选择在(DEFINE)条件下)使用PCRE(以及可能的其他正则表达式),则可以执行此操作。

以下示例在PHP中用于演示目的。 (?<digits>\d{3})的定义及其与(?&digits)的引用是在正则表达式中完成的。


实施例

preg_match(
    '/(?<digits>\d{3})([a-zA-Z]{3,}|[\.a-zA-Z]{10})(?&digits)/',
    '123abc456',
    $matches);

var_dump($matches[0]);

输出:

string(9) "123abc456"

定义示例:

$regex = <<<'REGEX'
/
(?(DEFINE)
    # A define condition allows you to create subpatterns for use by reference only.
    (?<digits>\d{3})
    (?<letters>[a-zA-Z]{3,}|[\.a-zA-Z]{10})
)
(?&digits)((?&letters))(?&digits)
/x
REGEX;

preg_match($regex, '123abc456', $matches);

var_dump($matches[0]);

输出:

string(9) "123abc456"

有关更复杂的示例,请参阅我的答案here,了解如何为简单语法创建语法分析器。

答案 1 :(得分:2)

您可以使用任何用于执行regexp的编程语言来执行此操作。例如。在PHP中你可以做到:

$subre = '\d{3}([a-zA-Z]{3,}|[\.a-zA-Z]{10})';
if (preg_match("/{$subre}blah{$subre}/", $string)) {
    ...
;

答案 2 :(得分:0)

我知道这是旧的,但你可以使用纯正的Regex,使用递归来实现这一点。

在这里,我将您的群组命名为'name',然后我在最后重复使用两次

(?'name'\d{3})([a-zA-Z]{3,}|[\.a-zA-Z]{10})\g'name'\g'name'