[英]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
示例做了您可能想到的事情。
双引号可能会造成问题,因为它们会进行插值,然后您必须进行额外的转义。 使用单引号,然后将内部转义的特殊字符以这种方式带入正则表达式,无需任何解释。
运算符qw
和q
不进行插值。 请参阅perlop 中的 Quote 和 Quote-like Operators 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.