1

連続する 12 個の (多くの場合) 異なる float の文字列 (前に無関係なテキストがあり、フィールドをマークしている) を解析し、それらすべてを独自のキャプチャ グループにして、それらを収集したいと考えています。一度に 1 つずつマッチャー。私は次のように書くことで成功していることに気づきました:

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 個のフロートすべてを 1 つの長い文字列に入れます。これは私が望むものではありません。フロートを 1 つずつ選択するには別のパターンが必要になるからです。が好ましい。

ありがとう

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

できます。あなたが望んでいたように、それが 1 つの操作で実行できるかどうかを確認することに興味があります。

于 2010-08-30T22:55:18.730 に答える
1

単一の float に一致するように正規表現を記述し、Matcher.find(int)を使用して出現を繰り返すことができます。

于 2010-08-30T22:03:32.850 に答える