2014-01-25 40 views
1

我试图用正则表达式从字符串中提取一些信息。从字符串中提取一些信息 - Java +正则表达式

我正在研究一个需要输入用户输入的时间范围的程序,并且我需要将字符串分解为每个时间单位(年,月,周,天,小时和分钟)。

字符串示例:1y30d would represent 1 year 30 days. 1y1m30mi would be 1 year 1 month 30 minutes

任何想法如何去做这件事?我正在用正则表达式来做这件事,但我从来没有真正使用过正则表达式,所以我不知道从哪里开始。

感谢您的任何帮助。

+0

这里是一个[互动REGEX教程](http://regexone.com/)。 – csmckelvey

回答

3

如果你想匹配像模式:

1y2m3d45h6mi7s 

您可以使用下面的正则表达式(online demo here):

(?:(\d+)y)?(?:(\d+)m(?!i))?(?:(\d+)d)?(?:(\d+)h)?(?:(\d+)mi)?(?:(\d+)s)? 

正如你所看到的,它包括几个部分,如(?:(\d+)X)?X是你想要匹配的时间段的字符。这意味着:

(?:   open parenthesis, for "non-matching group" 
    (\d+)  any number of digits 
    X   followed by the character 'X' 
)?   and everything is optional 

而且,(?:(\d+)m(?!i))?,有负先行使其考虑1mi1分钟而不是一个月加上焦炭i(从另一个信息,即不是日期)。

而且一些Java代码与它(online demo here)工作:

public static void main(String[] args) throws java.lang.Exception { 
    parseInformation("1y30d"); 
    parseInformation("1y2m30mi"); 
    parseInformation("1y1mi"); 
    parseInformation("1y2m3d4h5mi6s"); 
} 

public static void parseInformation(String information) { 
    Pattern p = Pattern.compile("(?:(\\d+)y)?(?:(\\d+)m(?!i))?(?:(\\d+)d)?(?:(\\d+)h)?(?:(\\d+)mi)?(?:(\\d+)s)?"); 
    Matcher m = p.matcher(information); 
    while (m.find()) { 
     if (m.group().isEmpty()) { continue; /* found nothing, go on */ } 
     System.out.println(information + " found: '"+m.group()+"'"); 
     System.out.println("\t" + m.group(1) + " years"); 
     System.out.println("\t" + m.group(2) + " months"); 
     System.out.println("\t" + m.group(3) + " days"); 
     System.out.println("\t" + m.group(4) + " hours"); 
     System.out.println("\t" + m.group(5) + " minutes"); 
     System.out.println("\t" + m.group(6) + " seconds"); 
     System.out.println(""); 
    } 

输出:

... 
1y2m3d4h5mi6s found: '1y2m3d4h5mi6s' 
    1 years 
    2 months 
    3 days 
    4 hours 
    5 minutes 
    6 seconds 
+1

它似乎不适用于'1y1mi'。 – Toto

+0

@ M42你说得对,认为'mi'是分钟而不是月份+字符串结尾更安全。我修好了,谢谢! – acdcjunior

+1

现在没事,+1。 – Toto