Я работаю над системой маршрутизации, и я хочу разрешить пользовательские шаблоны регулярных выражений.
Мой вопрос: как я могу определить, содержит ли регулярное выражение группу захвата?
Так, например, шаблон [0-9]+
будет работать, потому что он не содержит группу захвата. Шаблон ([0-9]+)
не будет работать.
Пытался ltrim
а также rtrim
шаблон по (
а также )
маска символов, это будет работать с шаблонами, которые начинаются с такой группы захвата, как ([A-Za-z]+)
а также ([0-9]+)
, Но с шаблонами, которые содержат группу захвата в другом месте, это не будет работать. Итак, как я могу проверить, содержит ли шаблон группу захвата?
Сначала вы должны сопоставить и исключить любые экранированные символы из результатов, затем проверить, есть ли открывающая скобка, оставшаяся одна или за ней следует ?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
}