【问题标题】:Finding Substrings Between Nested Tags in Java在 Java 中查找嵌套标签之间的子字符串
【发布时间】:2017-10-10 15:43:35
【问题描述】:

我正在研究一种方法,该方法需要将表示类型声明的字符串解析为其组成部分。所以例如字符串

"List<T extends Integer>"

将产生以下数组:

["List", "T", "extends", "Integer"]

对于像这样的简单情况,我可以使用 apache-commons 的 StringUtils 类的 'substringsBetween' 方法来查找标签内的部分。我遇到的问题是 substringsBetween 方法似乎无法处理嵌套标签。如果我拨打以下电话:

StringUtils.substringsBetween("HashSet<ArrayList<T extends Integer>>", "<", ">");

我的结果是:

["ArrayList<T extends Integer"]

有没有办法使用 apache commons 来做到这一点,还是我需要手动解析字符串?如果我需要手动解析,是否有一个很好的算法示例?

【问题讨论】:

  • 您对嵌套标签的预期答案是什么? T extends Integer?
  • 虽然您可能会破解这一点,但确实感觉好像您正朝着需要一个成熟的解析器迈进。首先拆分为令牌[ "List", "&lt;", "T", "extends", "Integer", "&gt;" ],然后逐步遍历通过状态机的令牌,以构建解析树。对于 SO 答案来说,这个主题太大了,但请尝试:tomassetti.me/parsing-in-java
  • 第一步看StreamTokenizer
  • @slim 其中一些解析器看起来很有希望。我希望我不必走那条路,但希望我能找到一些轻量级的东西。

标签: java nested substring apache-stringutils


【解决方案1】:

您可以只拆分空格并将字符括号更改为被忽略。

例如....

    String example = "List<T extends Integer>";
    example = example.replace('<', ' ').replace('>', ' ');
    String[] word = example.split(" ");
    for(int i=0; i< word.length;i++) {
        System.out.print(word[i]+" ");
    }

如果您希望内括号具有相同的行为,您可以执行相同的操作,只需解析字符串中的唯一字符。

String exampleTwo ="HashSet<ArrayList<T extends Integer>>";
exampleTwo = exampleTwo.replace('<', '-').replace('>', '-');
String[] innerWord = exampleTwo.split("-");
for(int i=0; i< innerWord.length;i++) {
    System.out.print(innerWord[i]+" ");
}

//position is the same number of brackets
System.out.println(innerWord[0]); //HashSet
System.out.println(innerWord[1]); //ArrayList
System.out.println(innerWord[2]); //T extends Integer

【讨论】:

  • 简单地替换括号的问题是我失去了关于字符串的哪些部分是哪些部分的信息。我需要将括号外的部分与里面的部分分开处理。
  • 你是对的,但这只是一个大概的想法。当您发现开始拆分列表并获取标记之间的索引时,您可以按“”和“”(括号和空格)拆分并将它们放入列表中。我的意思是有很多方法可以做到这一点。如果要保留括号以进行调试,可以在替换之前添加一个额外的字符串。 (使用子字符串位置)。
猜你喜欢
  • 2015-09-16
  • 2019-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-12
  • 2021-07-02
  • 2013-05-29
  • 1970-01-01
相关资源
最近更新 更多