どのように私はパース人間はフォーマットとJavaの変動の多くのテキストテーブルを入力し、正規表現は答えがある場合はどのように適切に行の値を取得することができますか?

user8402764:

私は非常に変化し、ユーザの入力を解析する必要があります。例は次のようになります。

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のデモ

Javaでは

final String regex = "(?:^(Mammals?|Reptiles?|Birds?)|\\G(?!^))\\h+(\\d+(?:\\.\\d+)?)";

代わりに使用しての\d+(?:\.\d+)?数字と一致するように、あなたが使用するかもしれない可能性が\S+部分一致マッチングに1+回空白以外の文字を作成します。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=312608&siteId=1