2012-02-02 13 views
2

私は1行のテキストファイルを持っています。このようなもの:A10102012MikeM。最初の文字はAまたはPのいずれかで、次の数字は日付に対応し、次の名前は性別(MまたはF)に対応します。この情報をMapに解析する最良の方法は何ですか?もちろん、私は各要素のstring.substring(x、y)を取ることができます。しかし、それはあまりにもハードコーディングされているようです。これは何とか正規表現で達成できますか?Javaでのテキストファイルの解析

+0

DDMMYYY (M | F)の形式を常に厳密に守っていますか? – jbranchaud

+0

はい、名前の長さは異なる場合があります – jyriand

答えて

6

^(A|P)(\d+)(\w+?)(M|F)$ .Thisが動作します。この正規表現を試してみたが、いくつかの条件:

1)これは、日付の妥当性をチェックしません。

2)出力は、記載されているとおりに正確に記述する必要があります。

String str = "A10102012MikeM"; 

String p = "^([A|P])(\\d+)(\\w+?)(M|F)$"; 
Pattern pattern = Pattern.compile(p); 
Matcher matcher = pattern.matcher(str); 
if (matcher.find()){ 
System.out.println(matcher.group(1)); 
System.out.println(matcher.group(2)); 
System.out.println(matcher.group(3)); 
System.out.println(matcher.group(4)); 
} 

出力=

10102012マイクM

1

はい、Javaは正規表現をサポートしています。あなたはjava.util.regex.Patternをチェックしたいと思うでしょう。正規表現のマッチからデータを抽出するMatcherグループに特に注意してください。

1

^(A|P)([0-9]){10}(.+)(M|F)$

  • グループ1 ... AまたはP
  • グループ2 ... 10桁の日付
  • グループ3 ...名
  • グループ4 ... MまたはF(性別)
1
^([AP])(\d+)([A-Za-z]+?)([MF])$ 

この正規表現は、(エスケープが行われていない)の異なる部分をキャッチデータをグループに分けて、簡単に入手できます。

1

正規表現の可能な代替は、あなたの正確な状況に応じて、SourceForgeのプロジェクトflatwormかもしれません。たとえば、テキストファイルを読み込んでJavaオブジェクトを読み込むことができます。

彼らは多くのユースケースを経験している良いfield guideを持っています。

関連する問題