Java中的正则表达式,连续多次使用相同的正则表达式

时间:2010-08-30 21:53:52

标签: java regex duplicate-removal

我想解析连续12个(通常)不同浮点数的字符串(前面有一些不相关的文本,标记一个字段),并且希望它们都以自己的捕获组结束,以便一次从匹配器中收集它们。我注意到我通过编写以下内容取得了成功:

Pattern lastYearIncomePattern = Pattern.compile("(.+\\{\\s)([0-9]{1,2}\\.[0-9]{3}\\s)([0-9]{1,2}\\.[0-9]{3}\\s)([0-9]{1,2}\\.[0-9]{3}\\s)([0-9]{1,2}\\.[0-9]{3}\\s)([0-9]{1,2}\\.[0-9]{3}\\s)([0-9]{1,2}\\.[0-9]{3}\\s)([0-9]{1,2}\\.[0-9]{3}\\s)([0-9]{1,2}\\.[0-9]{3}\\s)([0-9]{1,2}\\.[0-9]{3}\\s)([0-9]{1,2}\\.[0-9]{3}\\s)([0-9]{1,2}\\.[0-9]{3}\\s)([0-9]{1,2}\\.[0-9]{3}\\s)");

这是一个令人筋疲力尽的重复代码。部分([0-9]{1,2}\\.[0-9]{3}\\s)将出现12次。

有没有办法做得更好?我已经看过为自己定义该字符串,然后通过一些循环和一个StringBuilder将它添加到正则表达式中,但这一切看起来都太过分了。显然,反向引用也不起作用,因为12个值不同。

我的第一个方法是编写([0-9]{1,2}\\.[0-9]{3}\\s){12},但这会将所有12个浮点数放在一个长字符串中,这不是我想要的,因为我需要另一个模式来逐个挑选浮点数然后,然后是复制狂热解决方案。

由于

2 个答案:

答案 0 :(得分:3)

这个怎么样:

Pattern lastYearIncomePattern = java.util.regex.Pattern.compile("(.+\\{\\s)(([0-9]{1,2}\\.[0-9]{3}\\s){12})");

Matcher matcher = lastYearIncomePattern.matcher(input);
boolean found =matcher.find();
if(found){
  String[] values= matcher.group(2).split("\\s");
}

有效。有兴趣看看它是否可以像你希望的那样在一个操作中完成。

答案 1 :(得分:1)

您可以编写正则表达式以匹配单个浮点数,然后使用Matcher.find(int)来迭代这些事件。