Java正则表达式匹配函数内的参数

时间:2016-08-19 09:14:40

标签: java regex parameters

我想写一个正则表达式来提取parameter1的{​​{1}}和parameter2func1(parameter1, parameter2)parameter1的长度范围是1到64

parameter2

我的版本无法处理以下情况(嵌套函数)

(func1) (\() (.{1,64}) (,\\s*) (.{1,64}) (\))

func2(func1(ef5b, 7dbdd)) 我总是得到“7dbdd”。我怎么能解决这个问题?

5 个答案:

答案 0 :(得分:3)

使用"除了右括号外的任何内容" ([^)])而不仅仅是"任何事情" (.):

(func1) (\() (.{1,64}) (,\s*) ([^)]{1,64}) (\))

演示:https://regex101.com/r/sP6eS1/1

答案 1 :(得分:1)

使用[^)]{1,64}(匹配)以外的所有内容)代替.{1,64}(匹配任意),以便在第一个)之前停止

(func1) (\() (.{1,64}) (,\\s*) (.{1,64}) (\))
                                ^
                                replace . with [^)]

示例:

// remove whitespace and escape backslash!
String regex = "(func1)(\\()(.{1,64})(,\\s*)([^)]{1,64})(\\))";
String input = "func2(func1(ef5b, 7dbdd))";
Pattern p = Pattern.compile(regex); // java.util.regex.Pattern
Matcher m = p.matcher(input); // java.util.regex.Matcher
if(m.find()) { // use while loop for multiple occurrences
    String param1 = m.group(3);
    String param2 = m.group(5);

    // process the result...
}

如果要忽略空格标记,请使用以下标记:

func1\s*\(\s*([^\s]{1,64})\s*,\s*([^\s\)]{1,64})\s*\)"

示例:

// escape backslash!
String regex = "func1\\s*\\(\\s*([^\\s]{1,64})\\s*,\\s*([^\\s\\)]{1,64})\\s*\\)";
String input = "func2(func1 ( ef5b, 7dbdd ))";
Pattern p = Pattern.compile(regex); // java.util.regex.Pattern
Matcher m = p.matcher(input); // java.util.regex.Matcher
if(m.find()) { // use while loop for multiple occurrences
    String param1 = m.group(1);
    String param2 = m.group(2);

    // process the result...
}

答案 2 :(得分:0)

希望这有用

func1[^\(]*\(\s*([^,]{1,64}),\s*([^\)]{1,64})\s*\)

答案 3 :(得分:0)

(func1) (\() (.{1,64}) (,\\s*) ([^)]{1,64}) (\))

答案 4 :(得分:0)

^.*(func1)(\()(.{1,64})(,\s*)(.{1,64}[A-Za-z\d])(\))+

工作示例:here