如何引用一个转义定义符,它是一个转义(字面)元字符(Pe​​rl / PHP)?

时间:2014-01-04 19:49:11

标签: php regex string perl escaping

我不确定这一点并认为这是不可能的,但我想我还是会问。

我想使用一个名为metachar的正则表达式。例子是
括号,括号等。 [],(),...
但是真的。

它不是我需要这样做的,它是我试图编写一个逃避例程作为项目的一部分。

那么,问题是什么?当它不是真正的元数据时,问题出现在正则表达式中 它是一个文字,如:

/ \( \) /其中正斜杠分界符将替换为()

例如,在Perl中,这些不起作用 =~ m( \( \) )
=~ m( \\( \\) )
=~ m( \\\( \\\) )
=~ m( \\\\( \\\\) )

转义括号的任何数量都不会产生单个反斜杠,即文字\(
始终删除分隔符上的反斜杠,然后反斜杠的其余部分将遵循正常的引用规则。这总是会产生偶数个反斜杠。

PHP显然是一样的。

就像我说的,我不会在正常操作中使用元字符作为分隔符,这个 只是一个我想写的实用工具(现在似乎在jepardy)。

我正在尝试使用基本的转义规则,并希望避免扫描字符串
提前比较中的文字(转义)元字符的选定分界符 正则表达式文本正文。

Perl使用q()qq()来正确执行此操作(不幸的是不是qr())。
它通过同时删除转义上的转义和转义上的转义来实现此目的 因此q( \\\( \\\) )会产生\( \)

感谢您的帮助。

修改
经过一些研究后我发现这是不可能的,所以实用性被废弃了 谢谢你的宝贵意见。我对Perl的阵列印象非常深刻 引用选项,特别是'引用像操作员这样做的工作 但是,分隔符实际上是针对报价运算符而不是正则表达式。

3 个答案:

答案 0 :(得分:4)

[我不确定你是否在询问Perl或PHP。我只知道Perl]

正则表达式文字被解析两次,一次由Perl编译器解析,一次由正则表达式编译器解析。

  1. Perl解析器在处理插值,转义分隔符以及\Q\L等序列时查找文字的结尾。这会生成正则表达式模式(作为字符串)和匹配选项(例如,不区分大小写的匹配)。

    qr/\/\(/生成模式/\(/未转义)。同样,
    qr(\/\()生成模式\/((未转义)。

  2. 正则表达式编译器采用正则表达式模式和匹配选项,并返回已编译的正则表达式。

    /\(生成的正则表达式与/(完全匹配,而
    \/(生成正则表达式语法错误。

  3. 要生成与(完全匹配的正则表达式,您需要生成模式\(或等效项。您可以选择以下选项:

    • qr/\(/(不要将其用作分隔符)
    • $d='('; qr(\Q$d\E)(不要在文字中使用它)
    • qr(\Q\(\E)\Q成为\(后,使用(插入转义
    • qr(\x28)(使用等效的东西)
    • qr([\(])(以不需要转义的方式使用它)

    到目前为止,您最好的选择是简单地选择一个不同的分隔符:一个不是元字符,或者一个未在模式中使用的分隔符。这是微不足道的,因为它只对硬编码模式有用。

答案 1 :(得分:2)

我不了解PHP,但您可以在Perl中使用\Q

"()" =~ m(\Q\(\)\E) and print "YES\n"

使用单成员字符类应该可以在Perl和PHP中使用:

"()" =~ m([(][)]) and print "YES\n"

答案 2 :(得分:2)

你能更精确地开发你的例子吗?

因为
如果原始字符串 - > '\('
然后/[\\][(]/将匹配