我不确定这一点,认为这是不可能的,但我想我还是会问。
我想使用一个正则表达式,它是一个元字符。例如
括号、括号等。[ ], ( ), ...
但真的什么。
不是我需要这样做,而是我正在尝试编写一个转义例程作为项目的一部分。
那么,问题出在哪里呢? 问题出在正则表达式主体中,当它不是真正的元字符
时,它是一个文字,例如:
/ ( ) /
,其中正斜杠分隔符将替换为(
和)
例如,在Perl中,这些=~ m( ( ) )
=~ m( \( \) )
=~ m( \( \) )
=~ m( \\( \\) )
不起作用再多的括号转义也不会发出单个反斜杠,即文字(
始终删除分量表上的反斜杠,然后反斜杠的其余部分受正常引用规则的约束。这始终会导致偶数个反斜杠。
PHP显然也是这样。
就像我说的,我不会在正常操作中使用元字符作为分量表,这只是
我想要编写的实用程序(现在似乎处于危险之中)。
我正在尝试仅使用基本的转义规则,并希望避免提前扫描字符串
,比较正则表达式文本正文中
文字(转义)元字符的选定分律。
Perl 使用q()
和qq()
正确地做到这一点(不幸的是不是 qr() )。
它通过同时删除逃逸时的逃逸和逃逸时的逃逸来实现这一点。
所以q( \( \) )
结果是( )
.
感谢您的任何帮助。
编辑
经过一些研究,我发现这是不可能的,所以实用程序被废弃了。
感谢您的宝贵意见。我对 Perl 的一系列
引用选项印象深刻,尤其是"像引用运算符一样",它可以完成这项工作
,但 delimeter 实际上是针对报价运算符而不是正则表达式的。
[ 我不确定你问的是Perl还是PHP。我只知道 Perl ]
正则表达式文字被解析两次,一次由 Perl 编译器解析,一次由正则表达式编译器解析。
-
Perl 解析器在处理插值、转义分隔符和序列(如
Q
和L
)时查找文字的结尾。这将生成正则表达式模式(作为字符串)和匹配选项(例如不区分大小写的匹配)。qr//(/
产生模式/(
(/
未逃脱)。类似地,qr(/()
生成模式/(
((
未转义)。
正则表达式 编译器采用正则表达式模式和匹配选项,并返回已编译的正则表达式。
/(
生成一个完全匹配/(
的正则表达式,而/(
会产生正则表达式语法错误。
要生成完全匹配的正则表达式(
,您需要生成模式(
或等效项。以下是您的选择:
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"
你能更精确地开发你的示例吗?
因为
如果原始字符串 ->'('
那么/[\][(]/
将匹配它