2014-01-25 39 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