通过在perl中添加模式来比较两个字符串

时间:2014-02-18 05:46:22

标签: regex perl

我想匹配两个字符串,然后在最终输出中附加一些标签 例如,

$string1 = “Adaptive Actuator Failure and Structural <match>Damage</ match > Compensation of NASA”;

$string2 = “Adaptive Actuator Failure <?show $262#?>and Structural Damage <?show $262#?>Compensation of NASA”;

需要输出:

“Adaptive Actuator Failure <?show $262#?>and Structural <match>Damage</match> <?show $262#?>Compensation of NASA”

说明:我想将数据从string1映射到string2,但问题在于string2是否有其他元素。这些元素可以出现在string2中的任何地方。

注意:我们无法从string2删除标记,因为我们希望它保留在最终输出

我尝试为每个字母添加一个元素模式,但它不起作用。

我试过的代码:

$each = "(?:(?:\\s*<[\\#\\s\\\$\\w\\=\\-\\\"\\/\\?]+>\\s*)+)?".$each."(?:(?:\\s*<[\\#\\s\\$\\w\\=\\-\\\"\\/\\?]+>\\s*)+)?";

变量$每个包含每个字母,符号或空格。

还有其他逻辑吗?

1 个答案:

答案 0 :(得分:0)

您可以通过这种方式使用regexp。要注意,它不会太强大,它只适用于相对理智的输入。

use strict;use warnings;
my $string1 = “Adaptive Actuator Failure and Structural <match>Damage</ match > Compensation of NASA”;

my $string2 = “Adaptive Actuator Failure <?show $262#?>and Structural Damage <?show $262#?>Compensation of NASA”;

#search string 1
my $se1 = $string1;
my $se2 = $string2;
#remove all tags
$se1 =~ s!<[^>]*>!!gis;
$se2 =~ s!<[^>]*>!!gis;
#normalize spaces
$se1 =~ s!\s+! !gis;
$se2 =~ s!\s+! !gis;
#found a match
if ($se1 eq $se2){
  #found each tag is s1
  my $s = $string1;
  while ( $s =~ s!(<[^>]*>)(.+?)(</\s*[^>]*>)!!is){
     my $begin_tag = $1;my $end_tag = $3;my $text = $2;
     ### replace the text in the s2 with tagged
     $string2 =~ s!$text!$begin_tag$text $end_tag!is;

  }
}