作者d0068267 (Wei-Tse,Hsu)
看板java
标题[问题] Regular Expressions Pattern的Capturing Groups问题
时间Wed Aug 4 20:18:49 2021
大家好,我是Java的菜鸡,目前在学到Regular Pattern的地方
想请问正规表达式的问题,程式码如下:
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) );
}else {
System.out.println("NO MATCH");
}
}
}
我想请问的是Output的部分
Found value: This order was placed for QT3000! OK?
Found value: This order was placed for QT300
Found value: 0
为什麽"(.*)(\\d+)(.*)";
的m.group(1)是 This order was placed for QT300
就我目前的理解在API里面查到的内容为
. Any character (may or may not match line terminators)
X* X, zero or more times
X+ X, one or more times
\d A digit: [0-9]
.是任何字元、\\d是数字
那麽digit不是从3开始到300,也就是
m.group(1):This order was placed for QT
m.group(2):3000
m.group(3):! OK?
为什麽跟我想的不一样,是我误会(.*)(\\d+)(.*)的意思吗?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.165.119.107 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/java/M.1628079531.A.30C.html
1F:推 jej: 要搭配服用.find()和.matches() 等method的文件服用 08/04 20:33
2F:推 wxyy: String pattern = "(.*?)(\\d+)(.*)"; 08/05 13:20
3F:推 wxyy: 加个问号 就是你要的结果 08/05 13:22
4F:→ wxyy: 你可以下 regex greedy 这两个关键字去查资料 08/05 13:22
5F:→ ssccg: .是任何字元,不就包含数字,300可以是.*的部分也可以是\d+ 08/05 16:27
6F:→ ssccg: 的部分啊,你要先意识到这点再看下去 08/05 16:37
7F:→ ssccg: 再来才是300会归给哪部分,就是2楼提的比对模式的差别 08/05 16:40
8F:→ ssccg: 但是如果你的原意是前面的.*只包含非数字部分,何不一开始 08/05 16:45
9F:→ ssccg: 就排除数字,不要用.*,用\D* 08/05 16:45
十分感谢你们的回覆,我了解了!
※ 编辑: d0068267 (1.165.114.83 台湾), 08/06/2021 00:40:59