我正在自动生成正则表达式以验证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
是否应该转义分隔符?
答案 0 :(得分:1)
PHP documentation对此并不明确。它说的是:
\Q
和\E
可用于忽略模式中的正则表达式元字符。例如:\w+\Q.$.\E$
将匹配一个或多个单词字符,后跟文字.$.
并锚定在字符串的末尾。
但是,定界符不是“模式中的元字符”。它们用于确定模式的结束位置。因此,操作顺序显然是:
\Q
和\E
之间转义任何特殊字符。Perl documentation更清晰,通常描述引用结构的解析(正则表达式只是其中的一种特殊形式)。
第一步是找到引用结构的结尾。...
搜索单字符定界符时,将跳过转义的定界符和\。...
在此搜索过程中,没有注意结构的语义。
和其他地方:
对于正则表达式运算符(
qr//
,m//
和s///
)的模式,\Q
的引用在插值处理之后但转义处理之前应用。
但这仍然是在它第一次找到正则表达式的结尾之后。