Regex 如何使用在Perl的///运算符中包含正则表达式特殊字符的模式?

Regex 如何使用在Perl的///运算符中包含正则表达式特殊字符的模式?,regex,perl,Regex,Perl,我在s///中使用的模式包含正则表达式特殊字符。如何引用它们,以便正则表达式引擎将它们视为文字字符 我可以这样调用子例程quotemeta吗 $string =~ s/quotemeta($regex)/$new/g; 我该怎么做呢?您的意思是要引用s///运算符中的模式 您可以使用\Q和\E转义执行此操作: 将查找文本字符串[a-z],而不是。。。z 您可以找到这些信息,以及其他有用的信息,这些信息与perl一起安装在您的计算机上 Perl附带了优秀的文档。人们应该定期浏览/阅读所有内容。有

我在s///中使用的模式包含正则表达式特殊字符。如何引用它们,以便正则表达式引擎将它们视为文字字符

我可以这样调用子例程quotemeta吗

$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/