[英]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.