2016-05-27 18 views
0

申し訳ありませんが、これはnoobの質問ですが、私は正規表現と非常に快適ではないんだと(今のところ)ならば、これは少し私の理解を超えています。複数の日付形式を一致させる正規表現ですか?

私のジレンマは、私たちがアンドロイドのアプリケーションにスキャンを取得し、私はいくつかの日付を解析しようとしているIDバッジの真実を持っているということです。

例えば、いくつかの日付がそうのように表されます。

Pattern p = Pattern.compile("ISS(\\d{8})"); 
Matcher m = p.matcher(scanData); 

最初の2つの例のためにうまく働いたが、最近、私は、我々を実現しています

"ISS20141231" format = yyyyMMdd desired output = "20141231" 
"ISS12312014" format = MMddyyyy desired output = "12312014" 
"ISS12-31-2014" format = MM-dd-yyyy desired output = "12312014" 

は、現在、私は正規表現のパターンを持っていますセパレータとしてダッシュ(またはスラッシュ)を使用する日付を持つこともあります。

これらの日付を抽出する効率的な方法は、複数のパターンを書き込む必要がなく、それぞれのパターンをループして一致するかどうかを確認することですか? ISS([\ d {8}(\ d {2} \ w \ d {2} \ w \ d {4})(\ d {4} \ w \ d {2} } \ \ dの{2})])」

おかげW!

[EDIT] ただ、物事はもう少し明確にします。部分文字列( "ISSMMddyyyy")は、はるかに大きな文字列に由来し、その中のどこにでも置くことができます。だから、regexは元の(200バイト以上の)文字列を検索しなければなりません。

+2

[この質問](http://stackoverflow.com/q/277547/5743988)によると、正規表現を使って文字列からハイフンを削除するだけではありません。 @anabhavaがreplaceステートメントで行ったように、これを行う必要があります。 – 4castle

答えて

1

その日付文字列は、実際に大きな文字列の部分文字列である、とあなたがまたするために、正規表現が必要な場合そのパターンの検索、あなたがあるためにあなたの正規表現を修正することができます:

ISS([\\d\\-/]{8,10}) 

そして、キャプチャグループを検索し、ハイフンやスラッシュを取り除きます。

String dateStr = m.group(1).replaceAll("[/\\-]", ""); 
+0

素晴らしいソリューション!ありがとう! – Logic1

+0

他のユーザーのためのちょっとした修正ですが、\\ d- /パターンの部分は正確には正しくない範囲(\ dから/まで)として扱っていました。 ISS([\\ d \\ - /] {8,10})にする必要があります。ダッシュの前にバックスラッシュを気付かせてください。そうでなければこれは完璧です – Logic1

1

あなたは2つまり最初ISSを交換し、その後/または-を置き換える置き換えることが可能です。

str = str.replaceFirst("^ISS", "").replaceAll("[/-]", ""); 
0

またはだけに正規表現の使用: 検索:ISS([0-9] )([ - /。])([0-9] )([ - /。])を([0-9] *) $ {1} $ {3} $ {5}

+0

これは複数のグループを生成しますか?それでもループが必要ですか? Javaは唯一の$ 1サポートとして – Logic1

+0

ああ、それはJavaの互換正規表現ではありません。私の悪い。 – GordR

関連する問題