私は非常に変化し、ユーザの入力を解析する必要があります。例は次のようになります。
Example 1:
March
Morning Evening
(Avg Count) (Avg Count)
Birds 5.6 10.35
Mammals 2.0 3.3
Example 2:
March
Morning Afternoon Evening
(Num) (Num) (Num)
Birds 5.6 9 10
Mammals 2.0 2.5 3.3
Reptiles 1.0 5.6 1.75
Status Avg Total: Birds 24
Concerning that numbers have dwindled since last year
Example 3:
Early Mid Late
(Count) (Count) (Count)
Mammal 2.0 2.5 3.3 (Count)
Reptile 1.0 5.6 1.75 (Count)
理想的には、ユーザの入力が標準になりますが、それはちょうど今が起こることはないだろう。その代わりに、何がユーザの入力を解析するための最良の方法だろうか?
私の現在の戦略は、Javaの使用しているパターンマッチャークラスを。私は使用していmatcher.matchers()ヘッダのフォーマットが可能なフォーマットであるかどうかをテストするに。私は、用途はそのメソッドにテキストを送信することに基づいてmatcher.find()行からのキャプチャグループを取得します。これは、行名(例:哺乳類)を引き出すことになると値が言う2.0、及び3.3テキストのうちの第一の例からします。しかし、ユーザーの入力はので、この方法は非常に凝り性であることを、変化させます。
例えば、私が最初に引き出した鳥24のテキストでは、列と同様の形式を含んでいるので、捕捉基として実施例2から。行の任意のテキストが、行名を許可しないように、それを変更し、私はそう。しかし、今では実施例3のような行を引き出すことはできません(カウント)その隣に。
だから私の現在のアプローチは、正規表現を使用してヘッダー形式を確認してください。フォーマットした場合、列の名前と値を引き出します。でも、その戦略で、私は、行の適切な行と値を取得するには、右正規表現を見つけるの問題を抱えています。
以下のための私の現在の正規表現matcher.find()がこれです:
(Mammal|Reptile|Bird|Mammals|Reptiles|Birds)(^a-zA-Z-]*?[0-9])\r\n|[\r\n]
キャプチャグループ1は、行名及びグループ2は数字でなければならないであろう場合
だから私は2つの質問があります。
この問題にアプローチするより良い方法はありますか?
より良い方法がない場合、どのような右正規表現式が行を引き出し、それの値になるのでしょうか?
最初は鳥や使用して数字を含むグループ2のために繰り返さ試合のような行名を含む2つのキャプチャグループ使用することができ\G
アンカーを。
あなたが使用して、オプションの追加ができることを注意s?
など哺乳動物または哺乳類に一致するようにします
(?:^(Mammals?|Reptiles?|Birds?)|\G(?!^))\h+(\d+(?:\.\d+)?)
(?:
非キャプチャグループ^
文字列の先頭アサート(Mammals?|Reptiles?|Birds?)
キャプチャグループ1は、任意のオプションと一致します|
若しくは\G(?!^)
前回のマッチの終わりに位置アサート
)
閉じる非キャプチャグループ\h+
1+水平空白文字と一致(
キャプチャグループ2\d+(?:\.\d+)?
マッチ1+数字と小数点に一致するように、オプションパーツ
)
閉じるグループ2
Javaでは
final String regex = "(?:^(Mammals?|Reptiles?|Birds?)|\\G(?!^))\\h+(\\d+(?:\\.\\d+)?)";
注代わりに使用しての\d+(?:\.\d+)?
数字と一致するように、あなたが使用するかもしれない可能性が\S+
部分一致マッチングに1+回空白以外の文字を作成します。