输入为新行时如何使用拆分功能?

时间:2015-10-12 09:51:08

标签: java regex string

问题是我们必须拆分字符串并写下我们有多少单词。

Scanner in = new Scanner(System.in);
String st = in.nextLine();
String[] tokens = st.split("[\\W]+");

当我将输入作为新行并打印出来时。我已经得到了答案。但我希望它为零。我该怎么办?这里的分隔符都是符号。

2 个答案:

答案 0 :(得分:1)

简短回答:要获取str中的令牌(由空格分隔符确定),您可以执行以下操作:

String str = ... //some string
str = str.trim() + " "; //modify the string for the reasons described below
String[] tokens = str.split("\\s+");

更长的答案

首先,split()的参数是分隔符 - 在这种情况下是一个或多个空白字符,即"\\s+"

如果仔细查看String#split(String, int)的Javadoc(这是String#split(String)调用的内容),您将会看到它的行为。

  

如果表达式与输入的任何部分都不匹配,那么结果数组只有一个元素,即该字符串。

这就是"".split("\\s+")将返回一个带有一个空字符串[""]的数组的原因,因此您需要附加空格以避免这种情况。 " ".split("\\s+")返回一个包含0个元素的空数组。

  

如果在此字符串的开头存在正宽度匹配,则在结果数组的开头包含空的前导子字符串。

这就是" a".split("\\s+")返回["", "a"]的原因,因此您需要先trim()字符串从头开始删除空格。

  

如果n为零,那么模式将被应用尽可能多次,数组可以具有任何长度,尾随空字符串将被丢弃

由于String#split(String)调用String#split(String, int)limit参数为零,您可以在字符串末尾添加空格而不更改单词数(因为尾随空字符串将被丢弃) )。

<强>更新

如果分隔符为"\\W+",则会略有不同,因为您无法使用trim()

String str = ...
str = str.replaceAll("^\\W+", "") + " ";
String[] tokens = str.split("\\W+");

答案 1 :(得分:0)

public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String line = null;
        while (!(line = in.nextLine()).isEmpty()) {
            //logic
        }
        System.out.print("Empty Line");
    }

<强>输出

Empty Line