2012-01-12 81 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