- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在练习读取输入,然后对其进行标记。例如,如果我有 [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]”拆分为“[”或“,”或“]”,那么您实际上拥有:
但是,正如您调用了 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 limitn
is greater than zero then the pattern will be applied at mostn - 1
times, the array's length will be no greater thann
, and the array's last entry will contain all input beyond the last matched delimiter. Ifn
is non-positive then the pattern will be applied as many times as possible and the array can have any length. Ifn
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.
(强调我的)
因此,在此配置中,最终的空字符串将被丢弃。因此,您所拥有的正是您所拥有的。
<小时/>通常,要标记这样的东西,人们会选择 replaceAll
和 split
的组合:
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/
我正在尝试学习Rust。我正在阅读一本书online,该书实现了unix程序cat。现在,我试图读取作为像cargo run file1.txt file2.txt这样的参数传递的文件的内容,但是程序
我在 GHC 8.0.1 中遇到了一个带有种类索引 (?) GADT 的奇怪情况,其中在类型与种类签名中引入 foralls 会产生不同的类型检查行为。 考虑以下数据类型: {-# LANGUAGE
我正在使用 Perl 5.10 开发应用程序,HTML::Mason和 Apache 2.2。这是我第一次在大型项目中使用 Perl 5.10。我每隔一段时间就会出现奇怪的行为。应用程序因一个非常奇怪
我正在尝试将文件上传到aws中的rust中,因为我使用的是 rusoto_s3 的s3 rust客户端,当这些部分从单个线程发送时,我设法使分段上传代码正常工作不是我想要的,我想上传大文件,并且希望能
我是一名优秀的程序员,十分优秀!