【问题标题】:check if regex contains a capturing group检查正则表达式是否包含捕获组
【发布时间】:2016-09-30 15:56:52
【问题描述】:

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

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

它试图通过() 字符掩码来ltrimrtrim 模式,这适用于以([A-Za-z]+)([0-9]+) 等捕获组开头的模式。但是对于在其他地方包含捕获组的模式,这是行不通的。那么我如何检查模式是否包含捕获组?

【问题讨论】:

  • 为什么不允许用户使用捕获组?他可以潜在地使用它们来参考之前的比赛。例如 ([ab])c\1 将匹配 acabcb 但不匹配 acbbca
  • 你的目标语言是什么?
  • 抱歉忘了提,php

标签: php regex regex-group capturing-group


【解决方案1】:

首先,您应该匹配并忽略结果中的任何转义字符,然后检查是否有任何左括号单独存在,或者后跟?P<?'?<。这些是命名捕获组的开放语法。

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

PHP:

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

正则表达式解释:

\\.                     # 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
    }
    

    【讨论】:

      猜你喜欢
      • 2022-01-22
      • 1970-01-01
      • 2019-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      • 2021-01-06
      • 1970-01-01
      相关资源
      最近更新 更多