1

我想连续解析 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 个浮点数放在一个长字符串中,这不是我想要的,因为我需要另一个 Pattern 来一个接一个地挑选浮点数,然后是重复疯狂的解决方案是首选。

谢谢

4

2 回答 2

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");
}

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

于 2010-08-30T22:55:18.730 回答
1

您可以编写正则表达式以匹配单个浮点数,然后使用Matcher.find(int)遍历出现的事件。

于 2010-08-30T22:03:32.850 回答