我想在这个例子中返回组1的字符串,所以我有一个如下所示的模式。但它并不正确。任何人都可以帮我写这个模式吗?
Pattern pattern = Pattern.compile("^(\\w+-\\d)(\\s+)(\\d+)$");
String line = "list.txt-1 40";
Matcher list = pattern.matcher(line);
if(list.matches()) {
System.out.println("match");
} else {
System.out.println("Nope");
}
答案 0 :(得分:1)
失败,因为上述模式无法与.
匹配。为了匹配点,您需要将.
和\\w
放在一个字符类中,并使其重复一次或多次。
Pattern pattern = Pattern.compile("^([\\w.]+-\\d)(\\s+)(\\d+)$");
示例:
String s = "list.txt-1 40";
System.out.println(s.matches("([\\w.]+-\\d)(\\s+)(\\d+)"));
输出:
true
答案 1 :(得分:1)
您的正则表达式错误地匹配该模式。正则表达式标记\w
匹配任何单词字符。要匹配点,您需要在此处使用字符类。
^([\\w.]+-\\d)(\\s+)(\\d+)$
此外,要返回第1组捕获的匹配字符,您需要改为使用find()
。
String s = "list.txt-1 40";
Pattern p = Pattern.compile("^([\\w.]+-\\d)\\s+\\d+$");
Matcher m = p.matcher(s);
if (m.find()) {
System.out.println(m.group(1)); //=> "list.txt-1"
}
注意:除非您想要捕获,否则您不需要在每个令牌周围都有一个捕获组。
但是对于这个例子,split
将字符串放在“一个或多个”空格上会更容易。
String s = "list.txt-1 40";
String[] parts = s.split(" +");
System.out.println(parts[0]); //=> "list.txt-1"