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

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

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

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

1

Решение

Сначала вы должны сопоставить и исключить любые экранированные символы из результатов, затем проверить, есть ли открывающая скобка, оставшаяся одна или за ней следует ?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
2

Другие решения

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

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

if (preg_match($pattern, $testpattern)) {
// Capturing group found that is not at the start of the string
}
0

По вопросам рекламы [email protected]