2017-09-17 13 views
1
String line = "This order was placed for QT3000! OK?"; 
String pattern = "(.*)(\\d+)(.*)"; 

// Create a Pattern object 
Pattern r = Pattern.compile(pattern); 

// Now create matcher object. 
Matcher m = r.matcher(line); 
if (m.find()) { 
    System.out.println("Found value: " + m.group(0)); 
    System.out.println("Found value: " + m.group(1)); 
    System.out.println("Found value: " + m.group(2)); 
    System.out.println("Found value: " + m.group(3)); 

}else { 
    System.out.println("NO MATCH"); 
} 

出力:文字列の最後の数字が正規表現グループと一致しないのはなぜですか?

実測値:この順序はQT3000のために置かれました! OK?

実測値:0

実測値:この順序はQT300

実測値のために設置しました! OK?

質問:グループ2には300を持っていないし、ちょうど0

答えて

0

.*は欲張りなので。可能な限り一致させることを意味します。

最初のグループは最初にと一致しますが、文字列全体に一致しますが、\\d+は行末に一致しません。そのため、正規表現エンジンはバックトラックして、1文字少なくします。それは

まで、この順序が一致しQT300

のために置かれたことをやって続け、その後、\\d+は次に来る「0」にマッチします。最後に、最後のグループが文字列の最後に一致します。

番号のみを抽出する場合は、\\d+を使用してください。

0

それは\d+前ための貪欲.*である理由を私は理解していません。 .*は、できるだけ多くの文字をバックトラックする前に一致させて一致させることができます。\d+は、第2グループで1桁の数字が取り込まれることを意味します。

また、番号をキャプチャするために3つのグループは必要ありません。この正規表現を使用してください:

\d+ 

数字を取得する。

コード:

String line = "This order was placed for QT3000! OK?"; 
String pattern = "\\d+"; 

// Create a Pattern object 
Pattern r = Pattern.compile(pattern); 

// Now create matcher object. 
Matcher m = r.matcher(line); 
if (m.find()) { 
    System.out.println("Found value: " + m.group(0)); 
}else { 
    System.out.println("NO MATCH"); 
} 

出力:

Found value: 3000 
関連する問題