2016-07-15 122 views
0

我想匹配模式(使用java编程),但我只需要它的一部分。正则表达式 - 匹配模式但返回子模式

例...从下面的文字:

0 - Amount: 3 - Class 29 
1 - Amount: 2 - Class 21 
2 - Amount: 11 - Class 1 

我想匹配的模式“金额:\ d * - 类\ d *”,但只返回数对,从而使输出类似于数组:

{ 
    {3, 29}, 
    {2, 21}, 
    {11, 1} 
} 

我可以用java正则表达式中实现的东西来做到吗?我认为搜索匹配的字符串是不必要的,正则表达式似乎已经为这类问题做好了准备。

And ...做正则表达式(通常不仅是java正则表达式)有一个工具,以便从匹配的字符串中提取信息不需要额外的编程吗?如果某些其他正则表达式的实现比Java的这个工作更好,我可以切换编程语言。

+0

Java的正则表达式支持捕获组。 –

回答

1

你刚才用在你的正则表达式中使用括号捕获组:

Amount: (\d*) - Class (\d*) 
     ^--^-- Here---^---^ 

Regular expression visualization

Working demo

然后,你必须抓住从他们的内容与\1\2 。在Java中,你必须使用matcher.group(n)。例如,你可以有这样的代码:

String str = "0 - Amount: 3 - Class 29\n1 - Amount: 2 - Class 21\n2 - Amount: 11 - Class 1"; 

Pattern pattern = Pattern.compile("Amount: (\\d*) - Class (\\d*)"); 
Matcher matcher = pattern.matcher(str); 

StringBuffer sb = new StringBuffer("{"); 
while (matcher.find()){ 
    sb.append(String.format("{%s, %s},", matcher.group(1), matcher.group(2))); 
} 
sb.setLength(sb.length()-1); // remove last comma 
sb.append("}"); 

System.out.println(sb.toString()) 

Full IdeOne code

+0

这也与第二个捕获组中的Class类匹配。我想他只是想要数字。 –

+1

@m_callens对不起,有一个错字。用一些代码更新答案。感谢您指出, –

+0

明白!该功能的名称是“捕获组”。我刚刚了解了在线正则表达式测试器和语言编译器。谢谢!!! –