Вопрос:
Надеюсь, я правильно объясню это.
Возможно ли повторное использование части моего регулярного повторного использования в другом месте в регулярном выражении? Например, скажем, что у вас есть: d{3} (может быть намного сложнее, сделать это простым для цели вопроса), и вы хотите проверить это с помощью комбинации [a-zA-Z]{3,} или [.a-zA-Z]{10}. Это можно записать как d{3}([a-zA-Z]{3,}|[.a-zA-Z]{10}). Однако, если я захочу использовать это снова, возможно, в регулярном выражении, было бы возможно, или вы должны повторно написать этот шаблон снова, чтобы повторно использовать его. Любое понимание было бы оценено.
Лучший ответ:
Вы можете сделать это на любом языке программирования, который вы используете для выполнения регулярного выражения. Например, в PHP вы можете:
$subre = ‘d{3}([a-zA-Z]{3,}|[.a-zA-Z]{10})’; if (preg_match(«/{$subre}blah{$subre}/», $string)) { … ; Ответ №1
Вы можете сделать это, если используете PCRE (и, возможно, другие ароматы регулярных выражений), используя подшаблоны, необязательно в условии (DEFINE).
Приведенные ниже примеры приведены в 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»
Для более сложного примера см. Мой ответ здесь о создании синтаксического анализатора для простой грамматики.
Ответ №2
Я знаю, что это старо, но вы можете выполнить это, используя чистое Regex, используя рекурсию.
Здесь я называю вашу группу ‘name’, затем я просто повторно использовал ее дважды в конце
(?’name’d{3})([a-zA-Z]{3,}|[.a-zA-Z]{10})g’name’g’name’