作者:橙子小狸 | 来源:互联网 | 2023-09-25 11:52
我有一个类似于String s = "date1,calculatedDate(currentDate,35),false";
的字符串。
我需要提取verify
函数的所有参数。因此,预期结果应为:
elem[0] = date1
elem[1] = calculatedDate(currentDate,35)
elem[2] = false
如果我在split
字符上使用,
函数,但得到了以下结果:
elem[0] = date1
elem[1] = calculatedDate(currentDate
elem[2] = 35)
elem[3] = false
此外,该方法必须通用,因为某些函数具有2或7个参数...
您有什么办法可以帮助我吗?
尝试一下:
String s = "verify(date1,calculatedDate(currentDate,35),false)";
Pattern p = Pattern.compile("(?<=verify\\()(\\w+)(,\\s)(.*)(,\\s)((?<=,\\s)\\w+)(?=\\))");
Matcher m = p.matcher(s);
while(m.find()) {
System.out.println(m.group(1) + "\n" + m.group(3) + "\n" + m.group(5));
}
更新s = "date1,false"
:
String s = "date1,false";
Pattern p = Pattern.compile("(\\w+)(,\\s)\\w+)");
Matcher m = p.matcher(s);
while(m.find()) {
System.out.println(m.group(1) + "\n" + m.group(3) + "\n" + m.group(5));
}
输出:
date1
calculatedDate(currentDate,35)
false
关于正则表达式:
-
(\\w+)
一个或多个(+)单词字符
-
(,\\s)
,
部分
-
(.*)
匹配任何字符,这里仅是两个,
之间的部分
-
(,
部分
-
((?<=,\\s)\\w+)
?<=
是积极的一面,有助于抓住,false
的一部分,但不包括,
,
您可以使用StringTokenizer在括号内解析您的参数:
final static String DELIMITER = ",";
final static String PARENTHESES_START = "(";
final static String PARENTHESES_END = ")";
public static List parseArguments(String text) {
List arguments = new ArrayList<>();
StringBuilder argParsed = new StringBuilder();
StringTokenizer st = new StringTokenizer(text,DELIMITER);
while (st.hasMoreElements()) {
// default: add next token
String token = st.nextToken();
System.out.println("Token: " + token);
argParsed.append(token);
// if token contains '(' we have
// an expression or nested call as argument
if (token.contains(PARENTHESES_START)) {
System.out.println("Nested expression with ( starting: " + token);
// reconstruct to string-builder until ')'
while(st.hasMoreElements() && !token.contains(PARENTHESES_END)) {
// add eliminated/tokenized delimiter
argParsed.append(DELIMITER);
// default: add next token
token=st.nextToken();
System.out.println("Token inside nested expression: " + token);
argParsed.append(token);
}
System.out.println("Nested expression with ) ending: " + token);
}
// add complete argument and start fresh
arguments.add(argParsed.toString());
argParsed.setLength(0);
}
return arguments;
}
即使输入以下内容,它也可以解析:date1,false,(a+b),x.toString()
成功找到了所有5 个参数,包括复杂的参数:
- (嵌套的)函数调用,例如
calculatedDate(currentDate,35)
-
(a+b)
之类的表达式
- 对诸如
x.toString()
之类的对象的方法调用
运行此demo on IDEone。
了解更多并扩展
(将来)可能会处理更复杂的文本或语法。
然后,如果正则表达式捕获,字符串拆分或标记化都不能解决,考虑使用或生成 {{3 }}或PEG-解析器。请参阅有关CFG-的讨论。