在字母数字和新行上拆分Java字符串?

时间:2016-01-13 16:12:11

标签: java

我有一个包含多行代码的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"]

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

-

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

3 个答案:

答案 0 :(得分:2)

Java的String.split()行为非常令人困惑。一个更好的分裂效用是Guava Splitter。他们的documentation详细介绍了String.split()

的问题
  

用于拆分字符串的内置Java实用程序可能会有一些奇怪的行为。例如,String.split以静默方式丢弃尾随分隔符,StringTokenizer正好尊重五个空白字符,而不是其他任何内容。

     

测验:",a,,b,".split(",")返回...

     
      
  1. "", "a", "", "b", ""
  2.   
  3. null, "a", null, "b", null
  4.   
  5. "a", null, "b"
  6.   
  7. "a", "b"
  8.   
  9. 以上都不是
  10.         

    正确的答案是以上都没有:"", "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/