如何引用转义(文字)元字符(Perl/PHP)的正则表达式Delimeter?
我对此不确定,认为这是不可能的,但我想我还是会问的 我想使用一个正则表达式delimeter,它是元字符。例如如何引用转义(文字)元字符(Perl/PHP)的正则表达式Delimeter?,php,regex,string,perl,escaping,Php,Regex,String,Perl,Escaping,我对此不确定,认为这是不可能的,但我想我还是会问的 我想使用一个正则表达式delimeter,它是元字符。例如 括号、括号等[],(),… 但任何事情都是真的 这并不是我需要做的,而是我试图在项目中编写一个转义例程 那么,有什么问题?当regex主体不是真正的元字符时,问题就出现了 它是一个文字,如: /\(\)/其中正斜杠delimeters将替换为(和) 例如,在Perl中,这些将不起作用 =~m(\(\) =~m(\\(\\) =~m(\\\(\\\) =~m(\\\\(\\\\) 再多的
括号、括号等[],(),…
但任何事情都是真的 这并不是我需要做的,而是我试图在项目中编写一个转义例程 那么,有什么问题?当regex主体不是真正的元字符时,问题就出现了
它是一个文字,如:
/\(\)/
其中正斜杠delimeters将替换为(
和)
例如,在Perl中,这些将不起作用=~m(\(\)
=~m(\\(\\)
=~m(\\\(\\\)
=~m(\\\\(\\\\)
再多的括号转义都不会出现一个反斜杠,即文字\(
delimeter上的反斜杠总是被删除,其余的反斜杠则遵循正常的报价规则。这总是导致偶数个反斜杠 PHP显然也是这样 正如我所说,在正常操作中,我不会使用元字符作为限定符,这
这只是我想写的一个实用程序(现在似乎在jepardy中) 我试图只使用基本的转义规则,并且希望避免扫描字符串
提前在
正则表达式文本体 Perl使用
q()
和qq()
来正确执行此操作(不幸的是不是qr()。它通过同时移除逃生阀上的逃生阀和Delimeter上的逃生阀来实现此目的。
因此,
q(\\\(\\\)
导致\(\)
谢谢你的帮助
编辑经过一些研究后,我发现这是不可能的,所以公用事业被废弃了。
不过,感谢您的宝贵意见。Perl的
报价选项,尤其是“类似报价的操作员”,其工作
但是delimeter实际上是用于quote操作符的,而不是正则表达式。我不了解PHP,但是您可以在Perl中使用
\Q
:
"()" =~ m(\Q\(\)\E) and print "YES\n"
使用单成员字符类应该在Perl和PHP中都适用:
"()" =~ m([(][)]) and print "YES\n"
你能把你的例子发展得更精确一点吗?
因为
如果原始字符串->
'\('
然后,
/[\\][(]/
将匹配它[我不确定你是问Perl还是PHP,我只知道Perl]
正则表达式文本被解析两次,一次由Perl编译器解析,一次由正则表达式编译器解析
\Q
和\L
)时查找文本的结尾。这将生成正则表达式模式(作为字符串)和匹配选项(例如不区分大小写的匹配)
qr/\/\(/
生成模式/\(
(/
未被替换)。类似地,qr(\/\()
生成模式\/(
((
未被替换)/\(
生成与/(
)完全匹配的正则表达式,而\/(
产生正则表达式语法错误(
)的正则表达式,您需要生成模式\(
或等效模式。以下是您的选项:
(不要将其用作分隔符)qr/\(/
(不要在文本中使用)$d='(';qr(\Q$d\E)
(使用qr(\Q\(\E)
在\Q
已成为\(
)之后插入转义符)(
(使用等效物)qr(\x28)
(以不需要转义的方式使用)qr([\(])
到目前为止,您最好的选择是简单地选择一个不同的分隔符:一个不是元字符的分隔符,或者一个没有在模式中使用的分隔符。这很简单,因为它只对硬编码模式有影响。谢谢。通过delimeter是个问题。您指定的情况有效,因为delimeter被转义,或者在第二个示例中被内化。For实例
m*[*][*]*
将不进行分析。@sln:“”(=~m([\)][\(])并打印“YES\n”
,“**”=~m*[\*][\*]*并打印“YES\n”
你是对的,因为delimeters是转义的,但一般来说,我不认为未分类的文字元可以用作正则表达式delimeter。我认为这是徒劳的。谢谢你的帮助!@sln:我不确定你想实现什么。也许使用变量可以帮助你?$r=qr/\*\*/;“**”=~m*$r*并打印“是的\n”
再次感谢。实际上,我正试图创建一个通用实用程序,它接受一个简单的正则表达式字符串并添加和转义delimeters。但我现在明白了这是不可能的。谢谢。你说得对,但是如何使用(
和)
作为带有原始字符串的delimeters\(
?感谢您对Perl的深入了解。似乎没有编程方式引用regex delimeters。最接近的是“类似引号的运算符”,因为它们删除了转义的转义,并且delimeter转义允许单个转义(delimeter)要呈现给正则表达式引擎的字符。当然,如果使用元字符作为delimeters,这只是一个问题。唉,这种折磨已经走到了尽头。实用程序报废了!谢谢!