Regex 数据中意外插入的全字匹配

Regex 数据中意外插入的全字匹配,regex,perl,pattern-matching,Regex,Perl,Pattern Matching,我得考虑一下 my $string = 'String need to be evaluated'; 在$string中,我正在搜索求值或任何其他单词。 问题是它们可能在字符串中插入了一些标记 例如,字符串需要求值,这是意外的。 在这种情况下,我如何搜索单词 以下是我尝试的代码: my $string = 'Text to be evaluated'; my $string2 = "Te<data>xt need to be eval<data2>ua<data

我得考虑一下

my $string = 'String need to be evaluated';
$string
中,我正在搜索求值或任何其他单词。 问题是它们可能在字符串中插入了一些标记 例如,
字符串需要求值
,这是意外的。 在这种情况下,我如何搜索单词

以下是我尝试的代码:

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";   
}
my$string='Text to evaluation';
my$string2=“需要评估文本”;
#相配
$pattern=“已评估”;
@b=分割(“”,$pattern);
我的$i(@b){
$i=“$i”。\(?:\)?”;
打印“$i#\n”;
}
$pattern=join(“”,@b);
打印“\n$pattern\n”;
如果($string2=~/$pattern/){
打印“$pattern found\n”;
}

您是否建议使用其他方法或模块来简化此过程?我不知道将插入什么类型的数据。

当然,您可以使用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";
   }        
}
foreach my$s($string,$string2){
my$cs=$s;
###册封
$cs=~s!]*>!!gs;
###匹配
如果($cs=~m!$pattern!i){
打印“在$s中找到$pattern!\n”;
}        
}

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

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

for my $i(@b){
    $i=$i.".*";
    print "$i \n";
}
$pattern = join('',@b);
只要模式的字符仍然存在并且顺序正确,就应该匹配在随机插入之前具有该模式的任何字符串。 它确实在字符串
esouhgvw8vwrg355#*asrgl/\u[\w]atet(45)efdvd
中找到了噪音最大的地方。但当然,如果无法区分插入字符串和原始字符串,您将得到“假”肯定。例如,如果字符串过去是
evaluted
,它变成类似
evaluted
的值,则会得到一个正值。当然,如果您知道插入总是在标记中,而文本不是,那么用户的回答会更安全


只要您对输入字符串进行单引号引用,像[\w](45)之类的字符也不会有任何影响。我不明白为什么它们会在任何时候被插入。

先删除标记,然后再搜索?不,标记有重要信息。搜索必须处理任何意外的插入,所以,删除字符串副本上的标记?@mpapec我正在对单个变量进行替换处理,需要进一步处理。我必须在那个单一变量上做所有的事情。你为什么不能用一个副本呢?在该子线程的运行期间,其他线程可能会插入新标记吗?或者只是为了保存标签?但是Op明确地不想删除标签。原因不清楚,但这似乎是一个要求。我已经更改了脚本,但如果这个小更改不适合您,请阅读。有很多关于如何使用Perl编程的好书。非常感谢,幸运的是我可以阅读。是的,这显然是一个切实可行的答案。但Op在评论中明确表示,他不想删除标签,不管是不是副本。当然,现在还不清楚他为什么不想制作一份拷贝,删除拷贝中的标签,并与该拷贝进行匹配,但有人建议,他说这不是他所需要的。不知道为什么,我能想象的唯一原因是非常巨大的字符串,但谁知道呢。@DeVadder我不知道它会有什么样的插入。插入可以不是标记。这就是为什么我需要一个单独匹配该字符串的解决方案,因为在这种情况下复制$string是没有意义的。我在代码中给出的方法有点接近解决方案,但它不能处理插入括号数据或[\w+]、{\w+}或其他任何事情。@wagh-单词就是信号;“插入”就是噪音。要获得信号,即识别单词,必须识别并消除噪声。具体来说,“插入”与它们出现的单词有什么区别?如果你说不出噪音是什么——“插入”是什么——你怎么能找到单词呢?
$i=$i.*”
$i=$i.[^]+'在这种情况下可能更好。我只是想知道他们的任何模块是否可用于此实例。或者任何像schwatzian变换之类的方法或概念……每项改进都需要更多关于插入形式的知识。在第二个建议中,假设插入不包含空格。非贪婪不应该改变问题“匹配或不匹配”的结果,因为贪婪和非贪婪都试图匹配最长/最短的子字符串,该子字符串仍然允许模式的其余部分匹配。但对于替换,它确实应该更好。@wagh至于Schwartz转换和类似的东西:我个人不喜欢只提高Perl时间效率的东西。如果任务在本应运行的机器上有时间限制,则不要使用Perl。或任何脚本语言。我喜欢Perl,但它的易用性和可读性(当然,如果编写为可读的话)而不是它的性能。为此,请使用更接近底层系统的工具。在我的例子中C++。