请考虑您有以下字符串:
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中。
答案 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的第一个捕获组中。