Perl正则表达式匹配数组

时间:2013-11-26 13:29:32

标签: regex arrays perl

我对正则表达式非常糟糕,并尝试在谷歌搜索,但我尝试的一切都没有用。

这是我的代码:

@liner = split(/\s+/, $_);
foreach my $v (@liner) {
    if ($v =~ /*.duplex.*/) {
        print ECRIRE ";$v";
    }
}

$ v包含类似:“全双工”,但可以包含“半双工”等其他内容....

所以我希望我的条件匹配“任何字符”双工“任何字符”。

我尝试了if ($v =~ /(*.)duplex(.*)/)

之类的内容

还有其他人,但没有工作。任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:3)

foreach (split(/\s+/)) {
    print ECRIRE ";$_" if /duplex/i;
}

幸运的是,在Perl中,RegEx与整个字符串不匹配,这意味着您不必使用“。*”前缀和后缀所有内容:

/abcd/

的同义词
/.*abcd.*/

(除非您使用的特定选项会为点的匹配字符添加换行符)

在所有情况下,此循环都匹配所有双工(/ i使RegEx不区分大小写)。

(未经测试,但手指交叉)

答案 1 :(得分:-1)

List::MoreUtils模块具有firstval函数,该函数将返回满足特定约束的列表中的第一个值。它对于编写简洁易读的代码非常有用。它不是核心模块,您可能需要安装它。

正如其他人所说的那样,正则表达式中所需要的只是/duplex/,因为它会检查字符串是否包含字符串。您可以使用/duplex/i来增强它,而split /\s+/执行不区分大小写的匹配。

最后,如果您正在撰写split ' ',那么您几乎肯定会想要split;这是一个文字的单空间字符串,而不是正则表达式,如果你没有提供第一个参数,它是/\s+/默认。区别在于,如果目标字符串以空格开始,则使用' '进行拆分将返回一个空字符串作为列表的第一个元素,而使用split它将返回只是非空格字符。如果您根本没有将参数传递给split ' ', $_,那么它相当于use strict; use warnings; use List::MoreUtils 'firstval'; $_ = 'simplex full-duplex half-duplex'; print firstval { /duplex/ } split; ,这通常是您想要的。

这个简短的程序证明了这些要点。

full-duplex

<强>输出

{{1}}