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

5
someText
1
2
3
4
moreText

我想在每个数字前添加一个前缀。
但是使用(\w+\R)(\d+\R)+(\w+)\1prefix\2\3只会在最后一个数字前添加前缀并删除其他数字。
是否有一种方法可以使用单个正则表达式完成此操作,还是我需要编写一个脚本来完成?

这实际上是我真正的正则表达式的简化版。但是,其思想是围绕数字的文本帮助我找到需要编辑的区域。我有许多大文件需要编辑,使用一个简单的正则表达式逐步替换需要花费一些时间。 - Garagos
1个回答

5
您的正则表达式存在问题,主要是在(\d+\R)+中使用了贪婪匹配,特别是最后的+。它的意思是,“尽可能多次地匹配这个组,只要不导致匹配失败”。因此,在您的文本中,它会一口气吞下1、2、3和4,直到无法再吞下为止,并将最后一次匹配放入第二个捕获组中。显然,正则表达式引擎无法表达可变参数组,那么您该如何解决呢?所以简短的答案是,我认为正则表达式并不适合完全自动化的处理,您需要编写一个脚本。
然而,对于稍微不那么自动化但仍包含周围文本的过程,您可以尝试:
find: (\w+\R)((?:\d+\R)+)(\w+)
replace: \1prefix\2\3

我们将第二组及其贪婪修饰符包含在额外的捕获括号中,并将实际匹配文本包含在非捕获组中。现在,我们有了完整的数字集合,可以将前缀添加到第一个数字中。有趣的副作用是第一个数字然后匹配第一组(\w+\R),如果您再次运行查找/替换,它会命中行中的下一个数字,直到不再匹配为止。
这样,您应该能够至少在只命中您感兴趣的添加此前缀的区域时浏览文件,并且不需要在每个文件中查找每个数字,这样做的时间不会太长。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接