在java正则表达式中捕获同一组的多个实例

时间:2016-04-03 11:30:43

标签: java regex capture-group

我试图使用正则表达式从一串pascal代码中提取参数名称,这是我尝试使用的最复杂的。请注意,永远不会有空格,括号将始终存在。

(rate:real;interest,principal:real)

我目前得到的内容如下:

[(](?:([\w]*)(?:[:][\w])?[;|,]?)*[)]

我希望我可以访问每个捕获组,因为重新通过参数,但显然我不能。对于上面的例子,我需要的值是" rate"," interest"和"校长"。

有解决方案吗?我自己的努力导致我to here他们提到

  

" matcher()with while ... find()"。

我不完全理解正则表达式,并希望得到任何帮助。感谢。

2 个答案:

答案 0 :(得分:1)

这是使用相对简单的正则表达式实现此目的的一种方法:

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

public class RegexTest {

    public static void main(String[] args) {
        String simple = "(rate:real;interest,principal:real)";
        String regex = "(\\w+:|\\w+,)";

        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(simple);

        while (m.find()) {
            System.out.println(m.group().substring(0, m.group().length() - 1));
        }
    }
}

我害怕我不知道帕斯卡尔,但看起来你的名字要么以冒号或逗号结尾。正则表达式查找这些字符串,然后删除最后一个字符(冒号或逗号)。

我从测试运行中获得的输出是:

rate
interest
principal

答案 1 :(得分:1)

您可以将positive lookbehind用作

((?<=[\(,;])[A-Za-z_]\w*)

正则表达式细分

(
  (?<=   #Positive look behind
    [\(,;] #Finds all position that have bracket, comma and semicolon
  )   
  [A-Za-z_]\w* #After finding the positions, match all the allowed characters in variable name following that position
)

<强> Regex Demo

String line = "(rate:real;interest,principal:real)";
String pattern = "((?<=[\\(,;])[A-Za-z_]\\w*)";

Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(line);

while (m.find()) {
    System.out.println(m.group(1));
}

<强> Ideone Demo