2017-02-17 104 views
2

Java的提取時間,我所定義的模式通過正則表達式

(?:.*+)(?<amount>\\d++\\.?+\\d*+)(\\s*+)(?<unit>.++) 

匹配諸如

5-6 minutes 
2 minutes 
2.5 hours 
1 to 2 minutes 
~2 hours 

我想提取所有上述的最後一部分字符串,如

6 minutes 
2 minutes 
2.5 hours 
2 minutes 
2 hours 

但正則表達式不起作用:( 想法?

編輯:Pattern.compile("5-6 minutes").matcher().find()應該產生true,但false.

+0

請出示不起作用的代碼。 –

+0

你的例子不夠明確,你可以做另一個輸入和輸出嗎? –

+0

見編輯....... –

回答

2

你需要尋找部分匹配字符串的結尾。要做到這一點,刪除,防止你的模式根本不匹配(所有格量化關閉backracking),並限制.+一個模式只匹配字母([a-zA-Z]+),或非空白字符(\S+),並添加$字符串定位結束。使用

(?<amount>\d*\.?\d+)\s*(?<unit>[a-zA-Z]+)$ 

Matcher#find()。請參閱regex demo

Java demo

String s = "5-6 minutes"; 
Pattern pattern = Pattern.compile("(?<amount>\\d*\\.?\\d+)\\s*(?<unit>[a-zA-Z]+)$"); 
Matcher matcher = pattern.matcher(s); 
if (matcher.find()){ 
    System.out.println(matcher.group(0)); 
}