[英]Regex matcher not giving expected result. Not matching number properly
我不明白為什么第二組只給我0。我希望3000。並且確實指向我可以更好地理解的資源。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexMatches {
public static void main( String args[] ) {
// String to be scanned to find the pattern.
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");
}
}
}
精確設置模式,在\\d
模式之前添加QT
,或使用.*?
而不是第一個.*
以獲取盡可能少的字符。
String pattern = "(.*QT)(\\d+)(.*)";
要么
String pattern = "(.*?)(\\d+)(.*)";
會做。 參見Java演示 。
(.*QT)(\\\\d+)(.*)
將匹配並捕獲第1組中除換行符以外的任何0+字符,並盡可能多地捕獲到第一個QT
(最后一個子模式) ),然后將1+個數字匹配並捕獲到組2中,然后將其余的行匹配並捕獲到組3中。
.*?
在替代模式中,將匹配除行換行符以外的任何0+個字符,並將其捕獲到組1中,並盡可能少 ,直到第一個1個或多個數字。
您也可以使用更簡單的模式,例如String pattern = "QT(\\\\d+)";
以獲取QT
之后的所有數字,然后結果將在第1組中(您在數字之前和之后將沒有文本)。
在*
量詞會嘗試盡可能多的匹配,因為它是一個greedy
量詞。 通過將其更改為*?
可以使其變得非貪婪(惰性) *?
然后,您的正則表達式將變為:
(.*?)(\d+)(.*)
您將在第二個捕獲組中匹配3000
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.