热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何拆分而不是全部拆分了解更多并扩展

我有一个类似于Strings"date1,calculatedDate(currentDate,35),false";的

我有一个类似于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-的讨论。


推荐阅读
author-avatar
橙子小狸
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有