如何引用一个正则表达式 Delimeter 它是一个转义的(字面)元字符 (Perl / PHP)?



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

我想使用一个正则表达式,它是一个元字符。例如
括号、括号等。[ ], ( ), ...
但真的什么。

不是我需要这样做,而是我正在尝试编写一个转义例程作为项目的一部分。

那么,问题出在哪里呢? 问题出在正则表达式主体中,当它不是真正的元字符
时,它是一个文字,例如:

/ ( ) /

,其中正斜杠分隔符将替换为()

例如,在Perl中,这些=~ m( ( ) )

=~ m( \( \) )
=~ m( \( \) )
=~ m( \\( \\) )

不起作用再多的括号转义也不会发出单个反斜杠,即文字(
始终删除分量表上的反斜杠,然后反斜杠的其余部分受正常引用规则的约束。这始终会导致偶数个反斜杠。

PHP显然也是这样。

就像我说的,我不会在正常操作中使用元字符作为分量表,这只是
我想要编写的实用程序(现在似乎处于危险之中)。

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

Perl 使用q()qq()正确地做到这一点(不幸的是不是 qr() )。
它通过同时删除逃逸时的逃逸和逃逸时的逃逸来实现这一点。
所以q( \( \) )结果是( ).

感谢您的任何帮助。

编辑
经过一些研究,我发现这是不可能的,所以实用程序被废弃了。
感谢您的宝贵意见。我对 Perl 的一系列
引用选项印象深刻,尤其是"像引用运算符一样",它可以完成这项工作
,但 delimeter 实际上是针对报价运算符而不是正则表达式的。

[ 我不确定你问的是Perl还是PHP。我只知道 Perl ]

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

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

    qr//(/产生模式/((/未逃脱)。类似地,
    qr(/()生成模式/(((未转义)。

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

    /(生成一个完全匹配/(的正则表达式,而
    /(会产生正则表达式语法错误。

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

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

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

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

"()" =~ m(Q()E) and print "YESn"

使用单成员字符类应该在 Perl 和 PHP 中同时工作:

"()" =~ m([(][)]) and print "YESn"

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

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

最新更新