取代量化的捕获组

时间:2015-11-17 17:48:17

标签: regex

我有一个看起来像的字符串:

Alabama,AL,Montgomery,Birmingham,4833722.0,1450116.6,,52420 (135767),,50645 (131170)

现在我对产生这个输出感兴趣:

Alabama,AL,Montgomery,Birmingham,4833722.0,1450116.6,52420,135767,50645,131170

现在,以下正则表达式捕获:,,52420 (135767),,50645 (131170)

(,,(\d+) \((\d+)\)){2}

然而(我知道)捕获组\2\3将只捕获最后一对。 当然我可以像这样编写这个正则表达式:(,,(\d+) \((\d+)\))(,,(\d+) \((\d+)\))但是我想知道是否有任何方法可以防止多次复制正则表达式模式?如果不是2次重复,那么它是一般的整数k怎么办?有没有办法独立访问捕获组?我的意思是,如果我可以做这样的事情会很棒:,\1,\2,\3,\4

2 个答案:

答案 0 :(得分:1)

好吧,{k}通常会被*+重复运算符替换;重复组构造,但如果你有重复组的捕获组,则只捕获最后一次迭代,并且不可能访问各个组。

,,(\d+) \((\d+)\)(?:,,(\d+) \((\d+)\))*

您可以看到引擎如何与重复的群组一起使用 - live demo

  

有没有办法独立访问捕获组?

     

我的意思是,如果我能做到这样的话会很棒:,\1,\2,\3,\4

但是,要在上述环境中使用单个组,您可以这样做:

,,(\d+) \((\d+)\),,(\d+) \((\d+)\)

Live Demo

答案 1 :(得分:0)

不要试图一次更换所有东西。只需一次捕获一个数字((\d+(\.\d+)?)),以及跟随它的任何非数字字符(\W+),并用一个逗号替换后者。这可能会留下一个尾随逗号,但你可以单独删除它。以下是Java的外观:

s = s.replaceAll("(\\d+(\\.\\d+)?)\\W+", "$1,").replaceAll(",$", "");

以下是第一部分的在线演示:DEMO