我正在尝试在字符串上的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
我不确定该怎么做。帮助
答案 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