【发布时间】:2019-06-21 16:27:37
【问题描述】:
我正在自动生成正则表达式来验证 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 是否应该转义分隔符?
【问题讨论】:
-
在 PHP 中,分隔符的处理有些粗略beforehand,而不是由知道 \Q 和 \E 的 PCRE 库处理。
-
只使用
[foo/bar]会有什么问题?顺便说一句,无论如何,我看不出用\Q ... \E包围该文本有什么意义,因为它不包含实际的正则表达式元字符。 -
你为什么不用
preg_quote()? -
@WiktorStribiżew 这似乎不是一个好的骗局,它没有在源代码中讨论
\Q...\E。 -
@Barmar:现在可以(更明确地)。 // 至于 Perl,我相信这更像是一个语言标记器问题(虽然从未研究过)。