gpt4 book ai didi

java - 与使用带有多个分隔符的 split 感到困惑

转载 作者:行者123 更新时间:2023-12-01 06:31:59 26 4
gpt4 key购买 nike

我正在练习读取输入,然后对其进行标记。例如,如果我有 [882,337],我只想获取数字 882 和 337。我尝试使用以下代码:

    String test = "[882,337]";
String[] tokens = test.split("\\[|\\]|,");
System.out.println(tokens[0]);
System.out.println(tokens[1]);
System.out.println(tokens[2]);

它可以工作,输出是:(空行)第882章337

我不明白的是为什么 token[0] 是空的?我预计只有两个 token ,其中 token[0] = 882 和 token[1] = 337。

我查看了一些链接,但没有找到答案。

感谢您的帮助!

最佳答案

拆分拆分给定的字符串。如果您“[882,337]”拆分为“[”或“,”或“]”,那么您实际上拥有:

  • 没什么
  • 882
  • 337
  • 没什么

但是,正如您调用了 String.split(delimiter) 一样,这会使用 limit 调用 String.split(delimiter, limit)为零。

来自documentation :

The limit parameter controls the number of times the pattern is applied and therefore affects the length of the resulting array. If the limit n is greater than zero then the pattern will be applied at most n - 1 times, the array's length will be no greater than n, and the array's last entry will contain all input beyond the last matched delimiter. If n is non-positive then the pattern will be applied as many times as possible and the array can have any length. If n is zero then the pattern will be applied as many times as possible, the array can have any length, and trailing empty strings will be discarded.

(强调我的)

因此,在此配置中,最终的空字符串将被丢弃。因此,您所拥有的正是您所拥有的。

<小时/>

通常,要标记这样的东西,人们会选择 replaceAllsplit 的组合:

final String[] tokens = input.replaceAll("^\\[|\\]$").split(",");

这将首先去掉开始 (^[) 和结束 (]$) 括号,然后在 , 上拆分。这样,您就不必使用从任意索引开始循环的有些迟钝的程序逻辑。

<小时/>

作为一种替代方案,对于更复杂的标记化,可以使用 Pattern - 这里可能有点过分,但在编写多个 replaceAll 链之前值得记住。

首先,我们需要在正则表达式中定义我们想要的标记(而不是我们要分割的标记) - 在本例中很简单,它只是数字,所以 \d

因此,为了从任意 String 中仅提取所有数字(无千位/小数分隔符)值,将执行以下操作:

final List<Integer> tokens = new ArrayList<>();    <-- to hold the tokens
final Pattern pattern = Pattern.compile("\\d++"); <-- the compiled regex
final Matcher matcher = pattern.matcher(input); <-- the matcher on input

while(matcher.find()) { <-- for each matched token
tokens.add(Integer.parseInt(matcher.group())); <-- parse and `int` and store
}

注意:我使用了占有正则表达式模式来提高效率

所以,你看,上面的代码比简单的 replaceAll().split() 稍微复杂一些,但它的可扩展性要强得多。您可以使用任意复杂的正则表达式来标记 almost any输入。

关于java - 与使用带有多个分隔符的 split 感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35074151/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com