我知道了吗?操作员启用“非贪婪”模式,但我遇到了一个问题,我似乎无法绕开。考虑像这样的字符串:最短匹配问题
my $str = '<a>sdkhfdfojABCasjklhd</a><a>klashsdjDEFasl;jjf</a><a>askldhsfGHIasfklhss</a>';
那里有开始和结束标记<a>
和</a>
,有钥匙ABC,DEF和GHI,但其他一些随机文本包围。例如,我想用<b>TEST</b>
替换<a>klashsdjDEFasl;jjf</a>
。但是,如果我有这样的事情:
$str =~ s/<a>.*?DEF.*?<\/a>/<b>TEST><\/b>/;
即使非贪婪操作符*?这并不做我想做的。我知道为什么它没有这样做,因为第一个<a>
匹配字符串中的第一个匹配项,并一直匹配到DEF,然后匹配到最接近的关闭</a>
。然而,我想要的是尽可能匹配最接近的开头<a>
并关闭</a>
到“DEF”。所以目前,我得到这个作为结果:
<a>TEST</b><a>askldhsfGHIasfklhss</a>
凡为我寻找的东西得到这样的结果:
<a>sdkhfdfojABCasjklhd</a><b>TEST</b><a>askldhsfGHIasfklhss</a>
顺便说一句,我并不是想在这里解析HTML,我知道有模块可以做到这一点,我只是问如何做到这一点。
感谢, 埃里克·塞弗特
谢谢,这正是我一直在寻找的。 – 2011-04-22 17:20:01