簡體   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