Java RegEx:如何仅提取模式匹配的可变部分

时间:2012-10-08 18:59:50

标签: java regex

请考虑您有以下字符串:

id: 1 name: Joe age: 27 id: 2 name: Mary age:22

你想在“年龄:”之后提取每个标记,但不是字符串“age:”本身。

所以我希望我Matcher的{​​{1}}返回27和22而不是“年龄:27”和“年龄:22”

有没有办法在Java Regex语法中指定这个指令,这看起来与Perl中的指令完全不同,在Perl中我学习了我的Regex基础知识?

这是我的代码:

group()

在Perl中,我可以使用{}来限制我想要提取的模式部分

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class RegExTest 
{
    public static void main(String[] args) 
    {
        Pattern namePtrn = Pattern.compile("age: *\\w*");

        String data = "id: 1 name: Joe age:27 id: 2 name: Mary age:22";

        Matcher nameMtchr = namePtrn.matcher(data);

        while(nameMtchr.find())
        {
            String find = nameMtchr.group();

            System.out.println ("\t" + find);
        }
    }
}

将返回

while($text =~ m/(age:{\w+})/g)
{
      my $find = $1;

      if($find)
      {
          print "\nFIND = ".$find;
      }
}

如果我把{}放在像

这样的年龄
FIND = 27
FIND = 22

它将返回

while($text =~ m/({age:\w+})/g)

所以我正在寻找像Perl的{}这样的东西,但是在Java中。

3 个答案:

答案 0 :(得分:7)

如果您使用Matcher.group(1)代替Matcher.group(),则可以捕获减去'age:'的模式:

String data = "id: 1 name: Joe age:27 id: 2 name: Mary age:22";
Pattern namePtrn = Pattern.compile("age:(\\w+)");
Matcher nameMtchr = namePtrn.matcher(data);

while (nameMtchr.find()) {
   String find = nameMtchr.group(1);
   System.out.println("\t" + find);
}

答案 1 :(得分:1)

尝试:

age:\s*(\d+)

匹配“年龄:”后跟任意数量的空格,后跟一个或多个数字。数字(数值)在第一组中捕获。

如果您想支持负年龄(即“未知年龄”或某事物的-1),您可以使用:

age:\s*(-?\d+)

哪个匹配“age:”后跟任意数量的空格,后跟零个或一个减号后跟一个或多个数字。数字和可选的减号(数值)将在第一组中捕获。

如果您不确定如何让捕获组工作,consult this question which has a few examples.

答案 2 :(得分:0)

使用未转义的括号:

Pattern namePtrn = Pattern.compile("age: *(\\w*)");

这将把它放在Matcher的第一个捕获组中。