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

时间:2016-03-22 12:17:14

标签: regex perl

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

我可以在这样的模式中调用子程序(quotemeta)吗?

$string =~ s/quotemeta($regex)/$new/g;

我该怎么办?

3 个答案:

答案 0 :(得分:5)

您的意思是要在s///运算符中引用 模式

您可以使用\Q\E转义符

来执行此操作
$s =~ /\Q[a-z]\E//;

将查找文字字符串[a-z],而不是a ... z中的单个字符。

您可以在计算机上安装的perldoc perlreref perl旁边找到此信息和其他有用信息。

Perl提供了出色的文档。人们应该定期浏览/阅读所有内容。

答案 1 :(得分:3)

几种方式:

my $quotedregex = quotemeta($regex);
$string =~ s/$quotedregex/$new/g;

$string =~ s/${\quotemeta($regex)}/$new/g;

$string =~ s/\Q$regex\E/$new/g;

答案 2 :(得分:1)

人们可能会来这里希望找到一种方法将子例程的返回值插入正则表达式 in situ 。请注意,这也适用于使用constant pragma实现的常量,这些常量实现为内联子例程

有很多方法可以做到这一点,传统方法是引用子程序的返回值并取消引用结果。这可以作为标量引用或匿名数组

还有Interpolation模块,它提供了与程序调用非常相似的绑定哈希,因此使代码更整洁,更易于阅读

鉴于此基本计划

use strict;
use warnings 'all';

use Interpolation E => 'eval', mysub => \&mysub;

my $string = '<<<OLD>>>';
my $new    = 'NEW';

sub mysub { 'OLD' }

以下任何内容都会将OLD替换为NEW中的$string

  • 取消引用对子程序返回值的引用

    $string =~ s/${\mysub($regex)}/$new/;
    
  • 取消引用包含子例程返回值的匿名数组

    $string =~ s/@{[mysub($regex)]}/$new/;
    
  • 使用Interpolation,一个简单的eval(安全排序)

    $string =~ s/$E{mysub($regex)}/$new/;
    
  • 使用绑定哈希Interpolation的{​​{1}}直接调用子例程

    %mysub

这展示了使用$string =~ s/$mysub{$regex}/$new/; Interpolation

回答原始问题
quotemeta

输出

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>>> 更清晰,并且打算用于此目的,因此您应该使用

\Q

在这个特定情况下