我不确定这一点并认为这是不可能的,但我想我还是会问。
我想使用一个名为metachar的正则表达式。例子是
括号,括号等。 [],(),...
但是真的。
它不是我需要这样做的,它是我试图编写一个逃避例程作为项目的一部分。
那么,问题是什么?当它不是真正的元数据时,问题出现在正则表达式中 它是一个文字,如:
/ \( \) /
其中正斜杠分界符将替换为(
和)
例如,在Perl中,这些不起作用
=~ m( \( \) )
=~ m( \\( \\) )
=~ m( \\\( \\\) )
=~ m( \\\\( \\\\) )
转义括号的任何数量都不会产生单个反斜杠,即文字\(
始终删除分隔符上的反斜杠,然后反斜杠的其余部分将遵循正常的引用规则。这总是会产生偶数个反斜杠。
PHP显然是一样的。
就像我说的,我不会在正常操作中使用元字符作为分隔符,这个 只是一个我想写的实用工具(现在似乎在jepardy)。
我正在尝试使用基本的转义规则,并希望避免扫描字符串
提前比较中的文字(转义)元字符的选定分界符
正则表达式文本正文。
Perl使用q()
和qq()
来正确执行此操作(不幸的是不是qr())。
它通过同时删除转义上的转义和转义上的转义来实现此目的
因此q( \\\( \\\) )
会产生\( \)
。
感谢您的帮助。
修改
经过一些研究后我发现这是不可能的,所以实用性被废弃了
谢谢你的宝贵意见。我对Perl的阵列印象非常深刻
引用选项,特别是'引用像操作员这样做的工作
但是,分隔符实际上是针对报价运算符而不是正则表达式。
答案 0 :(得分:4)
[我不确定你是否在询问Perl或PHP。我只知道Perl]
正则表达式文字被解析两次,一次由Perl编译器解析,一次由正则表达式编译器解析。
Perl解析器在处理插值,转义分隔符以及\Q
和\L
等序列时查找文字的结尾。这会生成正则表达式模式(作为字符串)和匹配选项(例如,不区分大小写的匹配)。
qr/\/\(/
生成模式/\(
(/
未转义)。同样,
qr(\/\()
生成模式\/(
((
未转义)。
正则表达式编译器采用正则表达式模式和匹配选项,并返回已编译的正则表达式。
/\(
生成的正则表达式与/(
完全匹配,而
\/(
生成正则表达式语法错误。
要生成与(
完全匹配的正则表达式,您需要生成模式\(
或等效项。您可以选择以下选项:
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)
你能更精确地开发你的例子吗?
因为
如果原始字符串 - > '\('
然后/[\\][(]/
将匹配