我有一个看起来像的字符串:
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
答案 0 :(得分:1)
好吧,{k}
通常会被*
或+
重复运算符替换;重复组构造,但如果你有重复组的捕获组,则只捕获最后一次迭代,并且不可能访问各个组。
,,(\d+) \((\d+)\)(?:,,(\d+) \((\d+)\))*
您可以看到引擎如何与重复的群组一起使用 - live demo。
有没有办法独立访问捕获组?
我的意思是,如果我能做到这样的话会很棒:
,\1,\2,\3,\4
但是,要在上述环境中使用单个组,您可以这样做:
,,(\d+) \((\d+)\),,(\d+) \((\d+)\)
答案 1 :(得分:0)
不要试图一次更换所有东西。只需一次捕获一个数字((\d+(\.\d+)?)
),以及跟随它的任何非数字字符(\W+
),并用一个逗号替换后者。这可能会留下一个尾随逗号,但你可以单独删除它。以下是Java的外观:
s = s.replaceAll("(\\d+(\\.\\d+)?)\\W+", "$1,").replaceAll(",$", "");
以下是第一部分的在线演示:DEMO