\ Q和\ E是否应该在PCRE中转义分隔符?

时间:2019-01-28 16:03:03

标签: php regex perl pcre

我正在自动生成正则表达式以验证URL。为避免冲突,我只是使用\Q\E来转义常规文本。不幸的是,我发现该语法无法在PHP中正常工作:

reg_match('/\Qfoo/bar\E/', 'foo/bar')
PHP Warning:  preg_match(): Unknown modifier 'b' in ... code on line ...

但它可以在grep中使用:

$ echo 'foo/bar' | grep -P '\Qfoo/bar\E'
foo/bar

在regex101中:

https://regex101.com/r/mKI0Q9/1

但不是在Perl中:

$ echo 'foo/bar' | perl -ne 'print $_ if m/\Qfoo/bar\E/'
Backslash found where operator expected at -e line 1, near "m/\Qfoo/bar\"

\Q\E是否应该转义分隔符?

1 个答案:

答案 0 :(得分:1)

PHP documentation对此并不明确。它说的是:

  

\Q\E可用于忽略模式中的正则表达式元字符。例如:\w+\Q.$.\E$将匹配一个或多个单词字符,后跟文字.$.并锚定在字符串的末尾。

但是,定界符不是“模式中的元字符”。它们用于确定模式的结束位置。因此,操作顺序显然是:

  1. 在输入字符串中查找模式,寻找匹配的定界符。
  2. 在模式中的\Q\E之间转义任何特殊字符。
  3. 执行其余的正则表达式解析。

Perl documentation更清晰,通常描述引用结构的解析(正则表达式只是其中的一种特殊形式)。

  

第一步是找到引用结构的结尾。...
  搜索单字符定界符时,将跳过转义的定界符和\。...
  在此搜索过程中,没有注意结构的语义。

和其他地方:

  

对于正则表达式运算符(qr//m//s///)的模式,\Q的引用在插值处理之后但转义处理之前应用。

但这仍然是在它第一次找到正则表达式的结尾之后。