繁体   English   中英

Java字符串拆分为字母数字和换行符?

[英]Java string split on alphanumeric and new lines?

我有一个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"]

还有另一种方法可以解决此问题? 谢谢!

-

编辑:我如何确保它忽略新行?

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);

使用您的正则表达式,将结果放入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,我的名字,是鲍勃,你好,我,我很好,]

另一个解决方案是在java.util.regex。*中使用regex包。

它涉及匹配器和模式。

    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());
    }

PS: https: //regex101.com/是测试您的正则表达式模式的一个很好的工具。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM