将字符串与单词列表匹配

时间:2009-11-12 02:33:47

标签: regex perl arrays

假设我有一个字符串“我把它打开了,它就像一个咩咩啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪”在字符串中,有没有一种方法可以不使用|在正则表达式中还是迭代每个单词?

TIA

3 个答案:

答案 0 :(得分:7)

如果您使用的是Perl 5.10,则可以使用smart match运算符:

my @words = qw/moo bar zip fjezz blaa/;
if ( @words ~~ $str ) { 
    # it's there
}

以上将进行相等检查(相当于grep $_ eq $str, @words)。如果你想要一个正则表达式匹配,你可以使用

if ( @words ~~ /$str/ )

否则,您会被List::Util中的grepfirst困住:

if ( grep { $str =~ /$_/ } @words ) { 
    ...
}

答案 1 :(得分:0)

鉴于你想要在@Foldo的答案评论中指出你想要提取比赛,我很困惑你为什么要避免交替:

use strict; use warnings;

use Regex::PreSuf;

my $str = 'i zipped the fezz and it blipped like a baa';

my $re = presuf(qw(moo baa zip fjezz blaa));

my @matches = $str =~ /($re)/g;

print "@matches\n";

输出:

zip baa

或者,您希望原始句子中的单词匹配吗?

use strict; use warnings;

use Regex::PreSuf;

my $re = presuf(qw(moo baa zip fjezz blaa));

my $str = 'i zipped the fezz and it blipped like a baa';

my @matches = grep { /$re/ } split /\s+/, $str;

print "@matches\n";

输出:

zipped baa

答案 2 :(得分:0)

我使用<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script> <div class="head titlebox"> <span id="artid">text</span> <h1 id="prod-title">text</h1> <span>text</span><span>text</span> <span>match</span> </div>grep正则表达式来查找匹配项。这为匹配条件带来了更大的控制和灵活性。例如,以下代码检查列表map中包含的任何单词是否在字符串@words中找到整个单词

$str

将输出:

use strict; use warnings;

my $str = "i zipped the fezz and it blipped like a baa";
my @words = qw/moo baa zip fjezz blaa/;

my @found = grep { $str =~ /\b$_\b/ } @words;
if ( @found )  { 
    print join(",", @found) . "\n";
}

如果您只在baa 中查找部分字匹配,请从正则表达式中删除字边界断言$str,即用以下内容替换上面的相应行代码:

\b

它将输出:

my @found = grep { $str =~ /$_/ } @words;

如果您想要原始字符串中的字词&#39; $ str&#39;匹配,使用baa,zip 并修改正则表达式,如下所示:

map

将输出:

my @found = map { $str =~ /(\b\w*?$_\w*?\b)/ ? $1 : () ; } @words;

我还想提及接受答案中描述的运算符baa,zipped 。如果您至少使用Perl 5.10.1,则可以使用smart match运算符查找整个单词匹配项。以下代码将字符串~~中的每个单词与单词$str列表进行智能匹配。 smartmatch将根据字符串相等性进行比较:

@words

并输出:

my @found = grep { $_ ~~ @words } split(/\s+/, $str) ;

智能匹配运算符Smartmatch is experimental at ./a.pl line 7. baa 首先在Perl 5.10.1中提供。从Perl 5.18开始,smartmatch has been marked as experimental如果您使用它,将会发出警告。此外,smartmatch行为在5.10.0和5.10.1之间已发生变化。 &#34; 接受的答案中提供的代码示例&#34;基于5.10.0语法已经过时(参见dreagtun的评论)。

注意:因此,您可能会认为智能匹配是一种非稳定的&#34; Perl功能。

PS:起初,我重写了接受的答案,但我的更改因为过于激烈而被拒绝了。因此我发布了自己的答案。