如何使用正则表达式比较数组的每个元素?

时间:2014-06-30 16:18:32

标签: arrays regex perl

我使用Lingua :: EN :: Tagger Perl模块来标记用户输入的词性。我的代码部分完美无缺。然而,问题是我只想保留具有“NN,NNS,NNP,NNPS”的名词标签的输入,并将这些单词存储在单独的数组@nounArray中。用户将输入诸如“你的名字是什么?”之类的问题。问题的每个元素都将被标记为:What/WP is/is your/PN name/NN

my @UserInput = $readable_text;
my @nounArray;
foreach my $UserInput (@UserInput){

    if ($UserInput =~ m/NN|NNS$|NNP$|NNPS$/){

              $UserInput = @nounArray;
    }
print @nounArray;
}

但是,运行代码时没有任何反应。目标是在将用户输入的名词与原始数组分开后,将它们的名词放在单独的数组中。我不想打印数组,但我这样做是为了查看代码是否正常工作。

3 个答案:

答案 0 :(得分:1)

由于您想迭代$readable_text中的单词,您可以先将它们拆分为数组,

my $readable_text = "What/WP is/is your/PN name/NN";
my @UserInput = split ' ', $readable_text;
my @nounArray;
foreach my $UserInput (@UserInput) {

  if ($UserInput =~ m/NN|NNS$|NNP$|NNPS$/) {
    # print "$UserInput\n";
    push @nounArray, $UserInput;
  }
}

print @nounArray;

答案 1 :(得分:0)

$匹配字符串的末尾。我想你的字符串最后至少有一个\n,这会阻止它们匹配。

但正如您在评论中指出的那样,您似乎在尝试匹配字边界,因此只需将$中的所有\b替换为{{1}}。

答案 2 :(得分:0)

首先,用空格分割你的单词:

my @UserInput = split /\s+/, $UserInput;

然后grep为名词:

my @nouns = grep { m%/N% } @UserInput;   # only noun tags include /N