2016-09-30 4 views
0

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

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

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

+1

Почему вы не позволяете пользователю использовать группы захвата? Он может использовать их для ссылки на предыдущий матч. Например, '([ab]) c \ 1' будет соответствовать' aca' или 'bcb', но не' acb' или 'bca' – Adassko

+0

и каков ваш целевой язык? – revo

+0

извините забыл упомянуть, php – Tafelglotzer

ответ

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 
0

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^