整个单词与数据中的意外插入匹配

时间:2014-01-28 09:44:15

标签: regex perl pattern-matching

我有字符串考虑

my $string = 'String need to be evaluated';

$string我正在搜索评估或任何其他字词。 问题是他们可能会在字符串中插入一些标签 例如。 Str<data>ing need to be eval<data>ua<data>ted这是出乎意料的。 在这种情况下,我如何搜索单词?

这是我试过的代码:

my $string = 'Text to be evaluated';

my $string2 = "Te<data>xt need to be eval<data2>ua<data>ted";
# patten to match
$pattern = "evaluated";

@b = split('',$pattern);

for my $i(@b){
    $i="$i"."\(?:<data>\)?";
    print "$i#\n";
}
$pattern = join('',@b);

print "\n$pattern\n";

if ($string2 =~ /$pattern/){
    print "$pattern found\n";   
}

您是否建议使用其他任何方法或模块来轻松实现?我不知道会插入什么样的数据。

2 个答案:

答案 0 :(得分:1)

不确定这是否是您需要的,但

是怎样的
@b = split('',$pattern);

for my $i(@b){
    $i=$i.".*";
    print "$i \n";
}
$pattern = join('',@b);

只要模式的字符仍然存在并且顺序正确,那么它应该匹配任何具有该模式的字符串,然后才能进行随机插入。 它确实在字符串evaluated中找到了esouhgvw8vwrg355#*asrgl/\u[\w]atet(45)<data>efdvd,它的噪音很大。但是,当然,如果无法区分插入和原始字符串,您将得到“假”积极的。例如,如果字符串曾经是evaluted并且它变成类似evalu<hereisyourmissinga>ted的字符串,那么您将获得积极的信息。当然,如果你知道插入总是在标签中而文本不是,那么用户回答会更加安全。

只要你单引号输入字符串,像[\ w](45)等字符也不应该受到伤害。我无法理解为什么他们会在任何时候进行插值。

答案 1 :(得分:0)

当然,您可以使用regexp来完成这项工作:

foreach my  $s ($string,$string2){
   my $cs= $s;
   ### canonize
   $cs =~ s!<[^>]*>!!gs;
   ### match
   if ($cs =~ m!$pattern!i){
      print "Found $pattern in $s!\n";
   }        
}