我有一个由前一个程序员编写的代码,一个正在引发编译错误的正则表达式preg_match:
$regex_t = "/" . $op . "(?\\>[^" . $op . $cl . "]+)*" . $cl . "/s";
preg_match($regex_t, $text, $inner);
我收到的警告是:
警告:preg_match():编译失败:无法识别的字符 之后(?或(? - 偏移4
)
另外,我想提一下,var_dump($regex_t)
的值为:
string '/\{(?\>[^\{\}]+)*\}/s' (length=21)
答案 0 :(得分:11)
由于一个奇怪的原因,程序员已经逃过了>
(这是不需要的)。
只需要转义这些字符才能获得文字字符(在字符类之外):
( ) ^ $ [ \ | . * + ?
{ # only in these cases: {n} {m,n} {m,}
# where m and n are integers
+模式分隔符
大多数情况下,不需要转义的转义字符(或者没有\b
\w
\d
等特殊含义的转义字符)会被忽略通过正则表达式引擎。但这不是这种情况,因为(?>
是打开原子组的固定序列,除了这些情况之外,不允许使用序列(?
:
(?:...)
(?>...)
(?i)
(?-i)
(?i:...)
(?-i:...)
(?=...)
(?!...)
(?<=...)
(?<!...)
(?|...|...)
(?(condition)...|...)
(?1)
(?-1)
(?R)
(?(DEFINE)...)
(?<John>...)
(?P<John>...)
(?'John'...)
(?&John)
(?P>John)
因此(?\
未被识别为这些序列之一,这就是您获得错误的原因。
也许程序员想要编写一个原子组(?>...)
(可能就是这种情况,因为自从重复该组后,如果以下子模式失败,使用原子组会减少回溯)或者忘记了非捕获组:
的{{1}},正如Avinash所说的那样,但要获得字面反斜杠,您需要在双引号字符串中使用四个反斜杠。