2012-01-12 90 views
2

我得到了一個字符串,格式如下:yyyyMMdd_HHmm_ss_unitCode_(status)。 我需要將每個組件映射到一個專用類的屬性。標記字符串

我想用這樣的正則表達式來定義我的令牌: {d+}4{d+}2{d+}2_{d+}2_{d+}2_{s+}3_{s+}2 =>爲近似正則表達式語法表示歉意,d表示十進制,s表示字符串。

如何告訴我的解析器第一組{d+}4必須在我的課程的「年」屬性中,第二組到「月」等等。

顯然,我可以這樣做:token.setYear(substring(0,4))但我想要更通用一些,因爲我沒有控制文件名的結構。 我還考慮定義一個xml結構,用startPosition,endPosition,屬性名稱來存儲和輸入。

總而言之,我認爲所有這些太複雜了。問題是我沒有一個單獨的分隔符來使我能夠使用String.split

+1

您解析字符串,你打算使用正則表達式,但是你不知道字符串的結構?這真是令人困惑。如果你不知道字符串的結構,我不知道你如何解析它。 – 2012-01-12 17:21:40

+1

好問題。有一件事我沒有得到:「我無法控制文件名的結構」。所以字符串是一個文件名? – paislee 2012-01-12 17:29:12

+0

我知道結構可以改變,這就是爲什麼我想通過正則表達式來定義它,以便能夠在結構改變時適應我的代碼。 – 2012-01-12 18:02:34

回答

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 2012-01-12 17:29:57

+0

這個非常好!這正是我需要的! – 2012-01-12 18:03:17

+0

我認爲所有'\ d'都需要'\\ d'以及'\('和什麼是'([^)+)'最後應該做什麼? – 2012-01-12 19:44:27