代码之家  ›  专栏  ›  技术社区  ›  nowox

是否\Q和\E应该转义PCRE中的分隔符?[副本]

  •  0
  • nowox  · 技术社区  · 5 年前

    我自动生成正则表达式来验证URL。为了避免冲突,我只是用 \Q \E

    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 回复  |  直到 5 年前
        1
  •  1
  •   Barmar Eduardo López    5 年前

    这个 PHP documentation 对此没有明确的说明。它说的是:

    \Q \E \w+\Q.$.\E$ .$. 并锚定在绳子的末端。

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

    1. 在输入字符串中查找模式,查找匹配的分隔符。
    2. \Q \E
    3. 执行regexp解析的其余部分。

    Perl documentation


    搜索单字符分隔符时,将跳过转义分隔符和\。。。。
    在搜索过程中,没有注意构造的语义。

    以及其他地方:

    对于正则表达式操作符的模式( qr// m// s/// ),引用自 \Q

    但这仍然是在它首次找到regexp的结尾之后。