正则表达式问题 - 精细倒退而不是前锋Textmate

时间:2011-04-25 01:54:40

标签: regex textmate oniguruma

我对正则表达式不是很好,但在Textmate中,我试图清除XML文件中的一些多行,看起来像

<comments>
    <sub_node>....
....
</comments>

我正在使用正则表达式查找/替换

<comments>(?m:.*)</comments>

上面有多次出现,但是如果我做了一个查找,它会找到第一个,然后选择中间的所有内容,包括外部节点,直到文件中的最后一个。

如果我从最后一行找到前一个(向后),它会正确捕获一个块。我不确定我在这里做错了什么,如果有人甚至可以建议一种更有效的方法。

感谢。

2 个答案:

答案 0 :(得分:2)

您需要使用非贪婪的限定符。我对Textmate一无所知,所以我不知道它是否支持它们。如果没有,您可以搜索<comments>,然后搜索任意数量的</comments>后跟<comments>的内容。 (这将是更具体的帮助,但你发布的例子不熟悉,必须是一些Textmate的怪异。)

答案 1 :(得分:0)

听起来对我来说是完全正常的行为。你只需要使用一个不情愿的量词,这意味着添加一个?,如下所示:

<comments>(?m:.*?)</comments>

这里唯一奇怪的是m(对于“多行”)修饰符,它允许.元字符匹配换行符。大多数正则表达式都称为“单行”或“点匹配全部”模式,并使用s来指定它。这些风格也倾向于支持m /“多线”模式,这会改变^$ anchors的行为。在TextMate中,这是默认模式,无法更改。