我想写一个正则表达式来提取parameter1
的{{1}}和parameter2
,func1(parameter1, parameter2)
和parameter1
的长度范围是1到64
parameter2
我的版本无法处理以下情况(嵌套函数)
(func1) (\() (.{1,64}) (,\\s*) (.{1,64}) (\))
func2(func1(ef5b, 7dbdd))
我总是得到“7dbdd”。我怎么能解决这个问题?
答案 0 :(得分:3)
使用"除了右括号外的任何内容" ([^)]
)而不仅仅是"任何事情" (.
):
(func1) (\() (.{1,64}) (,\s*) ([^)]{1,64}) (\))
答案 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