匹配数组元素是否与字符串部分匹配?
Match if element of array is a partial match to a string?
我知道
if ( grep(/^$pattern$/, @array) ) {...}
如果在数组的一个元素中找到整个字符串,这将 return 为真。
但是,我试图弄清楚如果数组中的元素之一与字符串的末尾部分匹配,如何 return 为真。
例如:
my @array = (".com", ".net", ".org");
my $domain = "www.example.com"; #<--Returns True
$domain = "www.example.gov"; #<--Returns False
$domain = "www.computer.gov"; #<--Returns False, .com not at end
有没有更优雅的方法来做到这一点而不创建 foreach()
并对每个元素使用 m//
匹配?
怎么样
my @array = (".com", ".net", ".org");
my $pattern = join "|", map quotemeta, @array;
if ($domain =~ /(?:$pattern)$/) # $ matches end of string
可以使用 List::Util
中的 any
if ( any { $re = quotemeta; $string =~ /$re$/ } @ary ) { ... }
$
匹配字符串的末尾,因此上面的匹配任何 $string
的 $re
模式在其末尾(无论该字符串之前出现什么)。
quotemeta 转义所有“ASCII non-word 字符”,因此(也)在正则表达式中具有特殊含义的事物。在这种情况下,它会将 .
(匹配任何字符的模式)转换为 \.
,一个文字点。
quotemeta
有一个可以在正则表达式中使用的 \Q ... \E
形式,对于
if ( any { $string =~ /\Q$_\E$/ } @ary ) { ... }
但要小心,不要逃避可能更复杂模式的其他部分。
我知道
if ( grep(/^$pattern$/, @array) ) {...}
如果在数组的一个元素中找到整个字符串,这将 return 为真。 但是,我试图弄清楚如果数组中的元素之一与字符串的末尾部分匹配,如何 return 为真。
例如:
my @array = (".com", ".net", ".org");
my $domain = "www.example.com"; #<--Returns True
$domain = "www.example.gov"; #<--Returns False
$domain = "www.computer.gov"; #<--Returns False, .com not at end
有没有更优雅的方法来做到这一点而不创建 foreach()
并对每个元素使用 m//
匹配?
怎么样
my @array = (".com", ".net", ".org");
my $pattern = join "|", map quotemeta, @array;
if ($domain =~ /(?:$pattern)$/) # $ matches end of string
可以使用 List::Util
中的any
if ( any { $re = quotemeta; $string =~ /$re$/ } @ary ) { ... }
$
匹配字符串的末尾,因此上面的匹配任何 $string
的 $re
模式在其末尾(无论该字符串之前出现什么)。
quotemeta 转义所有“ASCII non-word 字符”,因此(也)在正则表达式中具有特殊含义的事物。在这种情况下,它会将 .
(匹配任何字符的模式)转换为 \.
,一个文字点。
quotemeta
有一个可以在正则表达式中使用的 \Q ... \E
形式,对于
if ( any { $string =~ /\Q$_\E$/ } @ary ) { ... }
但要小心,不要逃避可能更复杂模式的其他部分。