检查正则表达式是否包含捕获组

时间:2016-09-30 15:56:52

标签: php regex regex-group capturing-group

我在路由系统上工作,我想允许自定义正则表达式模式。 我的问题是如何检测正则表达式是否包含捕获组?

因此,例如模式[0-9]+可以工作,因为它不包含捕获组。模式([0-9]+)不起作用。

它通过ltrimrtrim字符掩码尝试()模式,这适用于以{{1}等捕获组开头的模式}和([A-Za-z]+)。但是对于其他地方包含捕获组的模式,这将无效。那么如何检查模式是否包含捕获组?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我想你想知道是否有捕获组,例如(something)不在测试模式的开头。这似乎对我有用......

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

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