2

我正在尝试根据在某个匹配之前或之后不匹配的某个模式在 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

我不确定该怎么做。帮助?

4

2 回答 2

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
于 2013-10-30T12:50:01.210 回答
0

perlretut

Lookahead "(?=regexp)" 可以匹配任意正则表达式,但lookbehind "(?<=fixed-regexp)" 仅适用于固定宽度的正则表达式,即固定数量的字符长度。因此 "(?<=(ab|bc))" 很好,但 "(?<=(ab)*)" 不是。

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

于 2013-10-30T12:36:21.700 回答