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