1

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

(rate:real;interest,principal:real)

我目前得到的重新如下:

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

我希望当 re 传递参数时我可以访问每个捕获组,但显然我不能。对于上面的例子,我需要的值是“rate”、“interest”和“principal”。

有解决方案吗?我自己的努力使我来到这里他们提到使用

“matcher() with while…find()”。

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

4

2 回答 2

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
于 2016-04-03T12:09:10.367 回答
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
)

正则表达式演示

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 演示

于 2016-04-03T12:22:01.747 回答