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

amp*_*ent 2 java regex

请考虑您有以下字符串:

id: 1 name: Joe age: 27 id: 2 name: Mary age:22
Run Code Online (Sandbox Code Playgroud)

并且你想在"年龄:"之后提取每个标记,但不是字符串"age:"本身.

所以我希望我Matchergroup()回归27和22而不是"年龄:27"和"年龄:22"

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

这是我的代码:

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

      if($find)
      {
          print "\nFIND = ".$find;
      }
}
Run Code Online (Sandbox Code Playgroud)

会回来的

FIND = 27
FIND = 22
Run Code Online (Sandbox Code Playgroud)

如果我把{}和年龄相提并论

while($text =~ m/({age:\w+})/g)
Run Code Online (Sandbox Code Playgroud)

它会回来

FIND = age: 27
FIND = age:22
Run Code Online (Sandbox Code Playgroud)

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

Rei*_*eus 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);
}
Run Code Online (Sandbox Code Playgroud)