2017-02-17 6 views
2

Ich habe ein Muster definiert StringsJava-Extrakt Dauer von regex

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

passen wie

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

Ich möchte den letzten Teil aller oben extrahieren, wie

6 minutes 
2 minutes 
2.5 hours 
2 minutes 
2 hours 

Aber die Regex funktioniert nicht :( Gedanken?

Edit: Pattern.compile("5-6 minutes").matcher().find() sollte true ergeben, ist aber false.

+0

zeigen Sie den Code, das nicht funktioniert. –

+0

Ihr Beispiel ist nicht genug klar, können Sie eine andere Eingabe und Ausgabe? –

+0

Siehe edit ....... –

Antwort

2

Sie müssen sich für teilweise Übereinstimmungen am Ende der Zeichenfolge suchen. Um dies zu tun, entfernen Sie die .*+, die yout Muster überhaupt verhindert (der Possessiv-Quantifier deaktiviert Backtracking), und beschränken Sie die .+ mit einem Muster, das nur Buchstaben ([a-zA-Z]+) oder Nicht-Leerzeichen Zeichen (\S+), und fügen Sie hinzu $ Ende des Schnurankers. Verwenden Sie

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

mit Matcher#find(). Siehe 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)); 
}