Regex 如何使用在Perl的///运算符中包含正则表达式特殊字符的模式?
我在s///中使用的模式包含正则表达式特殊字符。如何引用它们,以便正则表达式引擎将它们视为文字字符 我可以这样调用子例程quotemeta吗Regex 如何使用在Perl的///运算符中包含正则表达式特殊字符的模式?,regex,perl,Regex,Perl,我在s///中使用的模式包含正则表达式特殊字符。如何引用它们,以便正则表达式引擎将它们视为文字字符 我可以这样调用子例程quotemeta吗 $string =~ s/quotemeta($regex)/$new/g; 我该怎么做呢?您的意思是要引用s///运算符中的模式 您可以使用\Q和\E转义执行此操作: 将查找文本字符串[a-z],而不是。。。z 您可以找到这些信息,以及其他有用的信息,这些信息与perl一起安装在您的计算机上 Perl附带了优秀的文档。人们应该定期浏览/阅读所有内容。有
$string =~ s/quotemeta($regex)/$new/g;
我该怎么做呢?您的意思是要引用s///运算符中的模式 您可以使用\Q和\E转义执行此操作: 将查找文本字符串[a-z],而不是。。。z 您可以找到这些信息,以及其他有用的信息,这些信息与perl一起安装在您的计算机上 Perl附带了优秀的文档。人们应该定期浏览/阅读所有内容。有几种方法:
my $quotedregex = quotemeta($regex);
$string =~ s/$quotedregex/$new/g;
或
或
人们来到这里可能希望找到一种方法,将子程序的返回值插入到regex模式中。请注意,这也适用于使用pragma实现的常量,这些常量作为内联子例程实现 有很多方法可以做到这一点,传统的方法是引用子例程的返回值并取消对结果的引用。这可以作为标量引用或匿名数组使用 还有一个模块,它提供了与过程调用非常相似的绑定哈希,从而使代码更整洁、更易于阅读 鉴于这一基本方案
use strict;
use warnings 'all';
use Interpolation E => 'eval', mysub => \&mysub;
my $string = '<<<OLD>>>';
my $new = 'NEW';
sub mysub { 'OLD' }
取消引用包含子例程返回值的匿名数组
$string =~ s/${\mysub($regex)}/$new/;
$string =~ s/@{[mysub($regex)]}/$new/;
使用插值,一个简单的计算方法就是安全排序
$string =~ s/$E{mysub($regex)}/$new/;
使用带绑定哈希%mysub的插值直接调用子例程
$string =~ s/$mysub{$regex}/$new/;
这演示了使用插值和quotemeta对原始问题的回答
在这种情况下$quoted=quotemeta$regex$string=~s/$quoted/$new/g;?据我所知,quotemeta不应该是搜索模式的一部分。是的,但我需要在一行中完成,是否可能这实际上是一行,我认为=但是,除了下面的优秀答案之外,可能会有所帮助。
$string =~ s/@{[mysub($regex)]}/$new/;
$string =~ s/$E{mysub($regex)}/$new/;
$string =~ s/$mysub{$regex}/$new/;
use strict;
use warnings 'all';
use Interpolation Q => \&CORE::quotemeta;
my $string = '<<<+*.$^>>>';
my $regex = '+*.$^';
my $new = 'NEW';
$string =~ s/$Q{$regex}/XXX/;
print $string, "\n";
<<<XXX>>>
$string =~ s/\Q$regex\E/XXX/