Regex 用Perl正则表达式替换CDATA字符串中的精确数字

Regex 用Perl正则表达式替换CDATA字符串中的精确数字,regex,perl,cdata,Regex,Perl,Cdata,我有一个Perl脚本,需要能够替换XML中CDATA标记中包含的值。我有以下问题: my $str = "<![CDATA[Replace 00 and 00 but don't replace 1001100.]]>"; my $source = "00"; my $target = "989898"; $str =~ s/(<!\[(?i)CDATA(?-i)\[.*)$source(.*\].*)/$1$target$2/g; 预期的产出将是: <![CDATA

我有一个Perl脚本,需要能够替换XML中CDATA标记中包含的值。我有以下问题:

my $str = "<![CDATA[Replace 00 and 00 but don't replace 1001100.]]>";
my $source = "00";
my $target = "989898";

$str =~ s/(<!\[(?i)CDATA(?-i)\[.*)$source(.*\].*)/$1$target$2/g;
预期的产出将是:

<![CDATA[HEREISSOMETEXT989898]]>
<![CDATA[/this/is/my/NEW_ME/path]]>

我还需要对路径进行一些更改,如下所示:

my $str = "<![CDATA[/this/is/my/CHANGE_ME/path]]>";
my $source = "CHANGE_ME";
my $target = "NEW_ME";
my$str=”“;
my$source=“CHANGE\u ME”;
我的$target=“NEW_ME”;
预期的产出将是:

<![CDATA[HEREISSOMETEXT989898]]>
<![CDATA[/this/is/my/NEW_ME/path]]>

但也需要以下功能:

my $str = "<![CDATA[/this/is/my/DONOTCHANGE_ME/path]]>";
my $source = "CHANGE_ME";
my $target = "NEW_ME";
my$str=”“;
my$source=“CHANGE\u ME”;
我的$target=“NEW_ME”;
期望输出:

<![CDATA[/this/is/my/DONOTCHANGE_ME/path]]>

基本上,我需要子字符串中的精确匹配,并且我不能使用任何未随Perl“开箱即用”提供的Perl库

我还编写了更简单的正则表达式:

$str =~ s/$source/$target/g if $_ =~ m/<!\[CDATA/i;
$str=~s/$source/$target/g如果$\uz=~m/
无论何时只要我需要替换字符串,比如
“ABC”
,甚至
“AB0”
,这都非常有效,但是如果我需要将
“00”
更改为
“10”
,这会造成很大的破坏,因为它将
“00”
替换为
“10”
(需要)和
“1000”
替换为
“1100”
(不需要)

任何帮助都将不胜感激!谢谢…

使用单词边界:

my $source = qr"\b00\b";

如果只想替换整个单词,请使用单词边界
\b

s/\b00\b/10/;
或者,如果只想在字符串前面或后面没有数字时替换,请使用环视断言:

s/ (?<![0-9]) 00 (?![0-9]) /10/x;

s/(?以下内容正好满足了我的需要:

if ($s_param =~ /\D/)
#I'm a word
{
  $_ =~ s/\b$s_param\b/$t_param/g if $_ =~ m/<!\[CDATA/i;
}
else
#I'm a number
{
  $_ =~ s/(?<![0-9])$s_param(?![0-9])/$t_param/g if $_ =~ m/<!\[CDATA/i;
}
if($s\u param=~/\D/)
#我是一个词
{

$\u=~ s/\b$s\u-param\b/$t\u-param/g如果$\u=~ m/这就是为什么我们有XML解析器的原因。同意……但不能使用。我还应该补充一点,即使我可以用任何XML模块解析这个XML,同样的工作也需要在字符串上完成……所以无论是XML还是没有CDATA的平面文件都会出现同样的问题。这样做了……我使用了以下方法:if($s\u-param=~/\D/){$\=~s/\b$s\$param\b/$t\$param/g如果$\=~m/这个答案出现在低质量的审查队列中,可能是因为你没有解释代码。如果你解释它(在你的答案中),你更有可能获得更多的赞成票,提问者更有可能学到一些东西!
if ($s_param =~ /\D/)
#I'm a word
{
  $_ =~ s/\b$s_param\b/$t_param/g if $_ =~ m/<!\[CDATA/i;
}
else
#I'm a number
{
  $_ =~ s/(?<![0-9])$s_param(?![0-9])/$t_param/g if $_ =~ m/<!\[CDATA/i;
}