正则表达式模式格式获取第一组

时间:2015-02-25 03:49:08

标签: java regex

我想在这个例子中返回组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");
    }

2 个答案:

答案 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"