繁体   English   中英

如何转义数组和grep中的Perl正则表达式字符?

[英]How to escape Perl regular expression characters in array and in grep?

我有两个问题,但也很容易回答。 可能只是一个新手问题。 谷歌上几乎没有这方面的内容。

第一:如何将 Perl 匹配运算符放入数组中? 例如所有这些字符:

{}[]()^$.|*+?\

然后与foreach一起使用?

其次,如果你有这个:

@array = qw(The $ quick ? brown | fox jumps over the lazy dog);

$string = "\? brown \|";

@new_array = grep(/$string/,@array);

如果@array 是一些文本,例如包含美元符号、问号等,如何在@array 中正确找到 $string? 如果您搜索正则表达式字符,它将变成运算符。 如果你这样做:

$string =~ s/\$/\$/gi; 

它当然会有相同的结果。

提前致谢。

这里的问题是:

$string = "\? brown \|";

只是一种误导性的写法:

$string = "? brown |";

最好的解决方法是(选项 1)根本不使用字符串,而是使用模式对象:

$pat = qr/\? brown \|/;

@new_array = grep(/$pat/,@array);

或 (2) 在创建模式时使用\\Q来“引用”字符串中的任何正则表达式元字符:

$string = "? brown |";

@new_array = grep(/\Q$string/,@array);

否则,您可以确保您的字符串最终实际包含\\? brown \\| \\? brown \\| (而不仅仅是? brown | )通过编写以下任何一个:

$string = "\\? brown \\|"; # option 3
$string = '\? brown \|';   # option 4
$string = "\Q\? brown \|"; # option 5

除了适当的引用之外,用于搜索匹配项的字符串不需要特别注意或转义。 如果匹配模式要按字面匹配,则需要对其进行转义,如果有额外的引用,则需要防止插值。 关于引用的评论见文末。 例如

my @spec_ch = qw({ } [ ] ( ) ^ $ . | * + ? \ ); 
my @matched = grep { /\$|\?/ } @spec_ch;
print "@matched\n";

版画

$ ?

您的实际示例,仅缩短并使用foreach (有关grep评论,请参见下文)。

my @patterns = ('\?', 'brown', '\|', 'fox');  # or  qw(\? brown \| fox); 
my $string   = '? brown |';                   # or   q(? brown |);
foreach my $patt (@patterns) {
    my ($match) = $string =~ /($patt)/;
    print "$match\n" if $match;
}

版画

?
brown
|

你的例子转过来了,所以要使用一个同时包含单词和转义字符的模式

my $str = q(The $ quick ? brown | fox jumps over the lazy dog);
my $patt = qr(\? brown \|);  # or simply '\? brown \|'
my ($match) = $str =~ /($patt)/;
print "$match\n" if $match;

版画

? brown |

您的grep示例的问题在于它试图以相反的方式匹配 - 变量$string用作模式,而数组中的单词作为字符串来搜索匹配项。

grep { $_ =~ /$string/ } @array; 
# regex syntax: $text =~ /$pattern/, so above $_ is string, $string is pattern

所以, $_呈现值The$quick (等)反过来,他们搜索模式$string他们的内部 上面的foreach示例做了您可能想到的事情。


双引号可能会造成问题,因为它们会进行插值,然后您必须进行额外的转义。 使用单引号,然后将内部转义的特殊字符以这种方式带入正则表达式,无需任何解释。

运算符qwq不进行插值。 请参阅perlop 中的 Quote 和 Quote-like Operators

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM