2

考虑您有以下字符串:

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

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

所以我希望我Matcher的 'sgroup()返回 27 和 22 而不是 "age: 27" 和 "age: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);
        }
    }
}

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

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

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

会回来

FIND = 27
FIND = 22

如果我把 {} 放在年龄左右

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

它会回来

FIND = age: 27
FIND = age:22

所以我正在寻找类似 Perl 的 {} 但在 Java 中的东西。

4

3 回答 3

7

如果您使用Matcher.group(1)而不是Matcher.group()您可以捕获模式减去“年龄:”:

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);
}
于 2012-10-08T19:09:03.393 回答
1

尝试:

age:\s*(\d+)

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

如果您想支持负年龄(即 -1 表示“年龄未知”或其他内容),您可以使用:

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

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

如果您不确定如何让捕获组工作,请参阅这个问题,其中有几个示例。

于 2012-10-08T19:01:59.567 回答
0

使用非转义括号:

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

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

于 2012-10-08T19:03:03.390 回答