Java字符串如何按字母数字和换行符进行分割?

6

我有一个 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}+")

但是出于某种原因,这似乎会在数组列表的第一个位置添加一个逗号,并将换行符替换为空字符串。
output = ["", "h", "llo", "my", "name", "is", "bob", "how", "are", "you", "", "i", "am", "fine"]

还有其他方法可以修复这个问题吗?谢谢!

--

编辑:如何确保它忽略换行符?


仅字母还是包含数字和字母? - sashok_bg
1
@evelyn:好的,但是为什么不把 3 视为分隔符,导致结果为 ["h", "llo", ...]?你如何区分要从单词中删除的分隔符和字符? - Mark Peters
输出与您所声称的不同。 h llo我的名字是bob你好我很好。 - YoungHobbit
我只是想知道如何定界新行并且丢弃前面的逗号。@YoungHobbit - evelyn
3将被视为分隔符。如果你运行 "\"h3llo, @my name is, bob! (how are you?)\"\n\n\"i am fine@@@@@\"".split("\\P{Alpha}+");,它会返回 [, h, llo, my, name, is, bob, how, are, you, i, am, fine] - Andrew Mairose
显示剩余6条评论
3个回答

2
Java的`String.split()`行为非常令人困惑。一个更好的字符串分割工具是GuavaSplitter。他们的文档详细介绍了使用`String.split()`存在的问题。
内置的 Java 字符串分割工具可能会有一些古怪的行为。例如,String.split 静默丢弃尾随分隔符,而 StringTokenizer 只识别五个空格字符,不识别其他字符。
问题:",a,,b,".split(",") 返回...
  1. "", "a", "", "b", ""
  2. null, "a", null, "b", null
  3. "a", null, "b"
  4. "a", "b"
  5. 以上都不是正确答案
正确答案是以上都不是正确答案: "", "a", "", "b"。只有尾随的空字符串被跳过了。这是什么鬼。
在你的情况下,应该可以使用以下代码:
Splitter.onPattern("\\P{Alpha}+").omitEmptyStrings().splitToList(output);

特别是在这里,omitEmptyStrings()会非常有用。 - Mark Peters

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]


0
另一个解决方案是使用java.util.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());
    }

顺便说一下,一个好的测试正则表达式模式的工具是https://regex101.com/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接