我有一个包含多行代码的test.txt文件,例如:
"h3llo, @my name is, bob! (how are you?)"
"i am fine@@@@@"
我想将所有字母数字字符和新行拆分为arraylist,以便输出
output = ["h", "llo", "my", "name", "is", "bob", "how", "are", "you", "i", "am", "fine"]
现在,我尝试用
分割我的文字output.split("\\P{Alpha}+")
但由于某种原因,这似乎在arraylist的第一个位置添加了一个逗号,并用空字符串替换换行符
output = ["", "h", "llo", "my", "name", "is", "bob", "how", "are", "you", "", "i", "am", "fine"]
还有其他方法可以解决这个问题吗?谢谢!
-
编辑:如何确保忽略新行?答案 0 :(得分:2)
Java的String.split()
行为非常令人困惑。一个更好的分裂效用是Guava Splitter
。他们的documentation详细介绍了String.split()
:
用于拆分字符串的内置Java实用程序可能会有一些奇怪的行为。例如,
String.split
以静默方式丢弃尾随分隔符,StringTokenizer
正好尊重五个空白字符,而不是其他任何内容。测验:
",a,,b,".split(",")
返回...
"", "a", "", "b", ""
null, "a", null, "b", null
"a", null, "b"
"a", "b"
- 以上都不是
醇>正确的答案是以上都没有:
"", "a", "", "b"
。仅跳过空字符串尾随。这是什么,我甚至不是。
在你的情况下,这应该有效:
Splitter.onPattern("\\P{Alpha}+").omitEmptyStrings().splitToList(output);
答案 1 :(得分:0)
使用正则表达式,将结果放在ArrayList
中(无论如何都是你想要的数据),然后只需使用removeIf
删除任何空字符串。
String input = "\"h3llo, @my name is, bob! (how are you?)\"\n\n\"i am fine@@@@@\"";
ArrayList<String> arrayList = new ArrayList<>(Arrays.asList(input.split("\\P{Alpha}+")));
arrayList.removeIf(""::equals);
System.out.println(arrayList);
结果:
[h,llo,my,name,is,bob,how,are,you,i,am,fine]
答案 2 :(得分:0)
另一个解决方案是在java.util.regex。*
中使用regex包它涉及Matcher和Pattern。
String input = "h3llo, @my name is, bob! (how are you?)\n"+
"i am fine@@@@@";
Pattern p = Pattern.compile("([a-zA-Z]+)");
Matcher m = p.matcher(input);
List<String> tokens = new ArrayList<String>();
while (m.find()) {
System.out.println("Found a " + m.group());
tokens.add(m.group());
}
P.S测试正则表达式模式的一个好工具是https://regex101.com/