2012-01-12 7 views
2

yyyyMMdd_HHmm_ss_unitCode_(ステータス)という形式の文字列があります。 各コンポーネントを専用クラスのプロパティにマップする必要があります。トークン化文字列

私はトークンを次のような正規表現で定義することを考えました: {d+}4{d+}2{d+}2_{d+}2_{d+}2_{s+}3_{s+}2 =>おおよその正規表現の構文を謝ります.dは10進数で、sは文字列です。

最初のグループ{d+}4はクラスの年属性に、2番目の値は "月"に、等しくなければならないことをパーサーに伝えることはできますか?

明らかに、私はちょうどこれを行うことができます:token.setYear(substring(0,4))私はファイル名の構造を制御できないので、少し一般的になりたかったです。 私はまた、startPosition、endPosition、格納してタイプする属性名を持つxml構造体を定義することも考えました。

全体的に、私はこのすべてを非常に複雑に思っていました。問題は、私にString.splitを使用できるようにする単一の区切りがないことです。

+1

、あなたは正規表現を使用する予定あなたは文字列の構造を知らないのですか?これは本当に混乱しています。文字列の構造がわからない場合は、文字列を解析する方法がわかりません。 –

+1

良い質問です。私が得ることのないことの1つ:「私はファイル名の構造を制御できません」。だから文字列はファイル名ですか? – paislee

+0

私は構造が変わることがあることを知っています。そのため、構造が変わるとコードを適合させるために正規表現を使って定義したいのです。 –

答えて

0
String input; // yyyyMMdd_HHmm_ss_unitCode_(status) 
SpecialClass output; 

String regex = "(\\d{4})(\\d{2})(\\d{2})_(\\d{2})(\\d{2})_(\\d{2})_([^_]+)_\\((.+)\\)"; 
Pattern p = Pattern.compile(regex); 
Matcher m = p.matcher(input); 

if (m.matches()) 
{ 
    output.year = m.group(1); 
    output.month = m.group(2); 
    // etc 
} 

例入力:

String input = "20120113_1234_27_500_(33)"; 

は、次のグループが生成されます:

Group 1: 2012 //year 
Group 2: 01 //month 
Group 3: 13 //day 
Group 4: 12 //hour 
Group 5: 34 //minute 
Group 6: 27 //second 
Group 7: 500 //unitcode 
Group 8: 33 //status 

テストプログラム:あなたは文字列を解析する必要がhttp://pastebin.com/upC5R9rP

+0

あなたが許可したいバラツキの数に応じて、あなたの正規表現を調整してください。 – theglauber

+0

これはとても良いです!これはまさに私が必要としたものでした! –

+0

最終的に '\ d'と' \( 'と'([^)+) 'が必要だと思いますか? –

関連する問題