eclipse - 正则表达式:替换多个组

时间:2010-10-18 13:33:32

标签: regex eclipse replace

someText
1
2
3
4
moreText

我想在每个数字之前添加一个前缀。

但使用(\w+\R)(\d+\R)+(\w+)\1prefix\2\3只会在最后一位数字前加上并删除其他数字。

有没有办法用一个正则表达式来做或者我应该在旁边写一个脚本?

1 个答案:

答案 0 :(得分:5)

正则表达式的问题是在(\d+\R)+中使用贪婪匹配,特别是最后+。这就是说,“尽可能多次匹配这个群体,只要它不会导致错过匹配”。因此,对于你的文本,它会吞噬1,2,3和4,然后再不再吞噬并将最后一个匹配放入第二个捕获组。显然,正则表达式引擎的性质无法表达可变组,无论如何你会如何解决它们?所以简短的回答,我认为正则表达式是完全自动化过程的错误工具,你必须编写一个脚本。

但是,对于仍然包含周围文本的自动化程度略低的问题,您可以尝试

find: (\w+\R)((?:\d+\R)+)(\w+)
replace: \1prefix\2\3

我们将第二组加上它的贪婪修饰符包装在一组额外的捕获parens中,并将实际匹配的文本包含在非捕获组中。现在,我们在他们自己的组中拥有完整的数字集,并可以将前缀添加到第一个。有趣的副作用是,第一个数字然后与第一个组(\w+\R)匹配,如果再次运行查找/替换,它将触及该行中的下一个数字,直到它不再匹配。

通过这种方式,你应该能够至少只搜索你有兴趣添加这个前缀的区域来运行你的文件,并且它不应该花费几乎与查找每个文件中的每个数字一样长。