Perl匹配句子中的确切值

时间:2015-06-21 05:17:36

标签: perl

如果在句子中找到完全匹配(对于值),我想打印。

if (index($sentence, $value ) != -1) { $logger->debug("DEBUG: $value found"); }

我试过把^ $值但是它没有用。

实际上它正在工作但在要匹配的单词是句子中单词的子串的情况下失败了。例如:如果值为abc,则脚本也会考虑单词BabcDabcabcf,因为它会在任何地方找到abc

例如:句子是"我很高兴Babc"。该脚本会在找到它时abc来考虑它。我希望它只有在找到确切的单词abc才能进入诊断打印,这个单词应该在&#34中找到;我很高兴abc"。

1 个答案:

答案 0 :(得分:1)

如果您想要精确匹配字词,index不适合使用。你可能需要一个正则表达式,因为它是Perl,TMTOWTDI - 还有不止一种方法。

#!/usr/bin/env perl
use strict;
use warnings;

my $value = "abc";
my @sentences = ("I am happy Babc", "I am happy abc");

print "Index method\n";
for my $sentence (@sentences)
{
    print "Found [$value] in [$sentence]\n" if (index($sentence, $value) != -1);
}

print "Regex method\n";
my $rx = qr/\b\Q$value\E\b/;
for my $sentence (@sentences)
{
    print "Found [$value] in [$sentence]\n" if ($sentence =~ $rx);
}

运行时,会产生:

Index method
Found [abc] in [I am happy Babc]
Found [abc] in [I am happy abc]
Regex method
Found [abc] in [I am happy abc]

这假设Perl的单词边界符合你想要的。除非您对单词的构成有严格的要求,否则它的机会至少是中等的(例如,请参阅Borodin' s comment)。

请注意,这在概念上类似于MCVE(How to create a Minimal, Complete, and Verifiable Example?)或SSCCE(Short, Self-Contained, Correct Example) - 两个名称和链接用于相同的想法。代码在几个方面略大于最小值,但不是很大(并将其压缩到最小值会降低其易读性)。