Проверьте, содержит ли регулярное выражение группу захвата

Я работаю над системой маршрутизации и хочу разрешить пользовательские шаблоны регулярных выражений. Мой вопрос: как я могу определить, содержит ли регулярное выражение группу захвата?

Так, например, шаблон [0-9]+ будет работать, потому что он не содержит группу захвата. Шаблон ([0-9]+) не будет работать.

Пытался ltrim а также rtrim шаблон по ( а также ) маска персонажа, это будет работать с шаблонами, которые начинаются с такой группы захвата, как ([A-Za-z]+) а также ([0-9]+), Но с шаблонами, которые содержат группу захвата в другом месте, это не будет работать. Итак, как я могу проверить, содержит ли шаблон группу захвата?

2 ответа

Сначала вы должны сопоставить и исключить все экранированные символы из результатов, затем проверить, есть ли открывающая скобка, оставшаяся одна или за ней следует ?P<, ?' или же ?<, Это открывающий синтаксис именованной группы захвата.

\\.(*SKIP)(?!)|\((?(?=\?)\?(P?['<]\w+['>]))

PHP:

if (preg_match("~\\\\.(*SKIP)(?!)|\((?(?=\?)\?(P?['<]\w+['>]))~", $regex)) {
    // Capturing group found
}

RegEx Объяснение:

\\.                     # Match any escaped character
(*SKIP)(?!)             # Skip over and omit recent match
|                       # OR
\(                      # Match a single `(`
(?(?=\?)                # Which if is followed by `?`
    \?                      #
    P?['<]\w+['>]           # Next characters should be matched as ?P'name', ?<name> or ?'name'
)                       # End of conditional statement

Я думаю, что вы хотите увидеть, есть ли группы захвата, например, (something) которые не находятся в начале тестового шаблона. Кажется, это работает для меня...

$pattern = '/^.+\(([^\)]+)\)/';

if (preg_match($pattern, $testpattern)) {
    // Capturing group found that is not at the start of the string
}
Другие вопросы по тегам