我无法理解为什么第二组只给我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");
}
}
}
答案 0 :(得分:2)
精确模式,在QT
模式之前添加\d
,或使用.*?
代替第一个.*
来获取尽可能少的字符。
String pattern = "(.*QT)(\\d+)(.*)";
或
String pattern = "(.*?)(\\d+)(.*)";
会做的。请参阅Java demo。
(.*QT)(\\d+)(.*)
将匹配并捕获除了换行符之外的任何0 +字符的第1组,尽可能多,直到最后一次出现QT
(后跟子模式),然后将匹配并捕获1+个数字到组2中,然后匹配并捕获到组3中的其余部分。
替代模式中的.*?
将匹配除了换行符之外的任何0+字符捕获到第1组,尽可能少,直到第一个或更多的第一个块位数。
您也可以使用更简单的模式String pattern = "QT(\\d+)";
来获取QT
之后的所有数字,结果将在第1组中(您将不会在数字之前和之后获得文本)
答案 1 :(得分:1)
*
量词会尝试尽可能多地匹配 ,因为它是greedy
量词。
您可以将其更改为*?
然后,你的正则表达式将成为:
(.*?)(\d+)(.*)
您将匹配第二个捕获组中的3000
。