使用 Perl 和 Regex,是否可以创建一个单行正则表达式来匹配某些短语而不匹配其他短语?规则存储在哈希中,限定符(列)需要匹配提供给它的表达式。
我有一个对象,其中包含我希望作为单行正则表达式输入的限定符。 例如:
my %filters = {
rule_a => {
regex => {
qualifier_a => qr/fruits/i,
qualifier_b => qr/apples|oranges|!bananas/i, # NOT bananas
}
}
}
因此,在这种情况下,我想匹配包含“水果”的 qualifier_a 和包含“苹果”、“橙子”但不是“香蕉”的 qualifier_b。
脚本如下遍历每个限定符:
my $match = 1; # Assume a match
foreach my $qualifier (keys %filters{rule_a}{regex}) {
# If fails to match, set match as false and break out of loop
$match = ($qualifier =~ /%filters{rule_a}{regex}{$qualifier}/) ? 1 : 0);
if(!$match){
last;
}
}
if($match){
# Do all the things
}
想法?
最佳答案
有点复杂,但它的工作:
^.*?bananas.*(*SKIP)(*FAIL)|apples|oranges
如果第一部分包含bananas
,则第一部分将匹配整个字符串,然后强制失败而不在下一个位置重试。
该演示使用 .
使行独立,但如果您的字符串可以包含换行符,您可以使用 s
选项。
关于regex - Perl 正则表达式 : Match this or that but NOT the other,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27362484/