Perl全球替代,展望未来,落后?

时间:2013-10-30 10:08:20

标签: regex perl substitution

我正在尝试在字符串上的perl中执行全局替换,这是基于在某个匹配之前或之后不匹配的特定模式。基本上,我有一个xml标记,并且如果匹配发生在标记之前或之后的十个字符内,则希望保留它,但如果没有则删除xml标记。

所以,如果我有一个包含的字符串:

foo something<xml tag>bar<\xml tag> something

不会发生替换,但如果字符串是

something <xml tag>bar<\xml tag> something

它将替换为:

something bar something

我尝试的是:

$string =~ s/(?<!foo.{0,10})<xml tag>(bar)<\/xml tag> |<xml tag>(bar)<\/xml tag>(?!.{0,10}foo)/$1/g;

但我收到了这个错误:

Variable length lookbehind not implemented in regex

我不确定该怎么做。帮助

2 个答案:

答案 0 :(得分:0)

来自 perlretut

  

Lookahead“(?= regexp)”可以匹配任意正则表达式,但是看起来很好看   “(?&lt; = fixed-regexp)”仅适用于固定宽度的正则表达式,即a   固定的字符数。因此“(?&lt; =(ab | bc))”很好,但是   “(?&lt; =(ab)*)”不是。

因此,如果单词在<xml tag>bar<\xml tag>之前具有固定长度,则应使用它,否则您可以使用多个正则表达式。

答案 1 :(得分:0)

使用e标志的一种方式:

while (<DATA>) {
    s/((.{0,13})<xml\ tag>([^<]*)<\/xml\ tag>)(?!.{0,10}foo)/
    index($2,'foo') > -1 ? "$1" : "$2$3"/xe;
    print $_; 
}

__DATA__
foo something<xml tag>bar</xml tag> something
something <xml tag>bar</xml tag> something

产地:

foo something<xml tag>bar</xml tag> something
something bar something