String Splitting错误输出

时间:2016-10-17 06:25:57

标签: java arrays regex string

我写了这个简单的程序,它在每个非数字字符处拆分给定的输入。

public class Fileread {
  public static void main(String[] args) throws IOException {
    //Declarations
    String[] temp;
    String current;

    //Execution
    BufferedReader br = new BufferedReader(new FileReader("input.txt"));
    while ((current = br.readLine()) != null) {
      temp = current.split("\\D"); //Splitting at Non Digits
      for (int i = 0; i < temp.length; i++) {
        System.out.println(temp[i]);
      }
    }
  }
}

这是input.txt:

hello1world2  
world3  
end4of5world6 

输出:

1




2





3



4

5




6

为什么会出现这么多额外空格?我需要在一个单独的行上打印每个数字,中间没有空格。我该如何解决这个问题?

4 个答案:

答案 0 :(得分:4)

它在EACH和每个非数字处分裂。

要将非数字字符串视为一个分隔符,请指定

temp = current.split("\\D+");

代替。添加加号使模式匹配一​​个或多个连续的非数字字符。

答案 1 :(得分:1)

简而言之,请使用

.replaceFirst("^\\D+","").split("\\D+")

使用\D(非数字字符匹配模式)拆分字符串意味着您一次匹配单个非数字字符,并在该字符处中断字符串。当您需要拆分字符块时,您需要匹配多个连续的字符,在您的情况下,您只需要添加{{1 +之后的}量词

但是,这意味着如果你的字符串在字符串的开头有一个非数字,你仍然会在索引0处有一个空元素。解决方法是使用拆分模式删除开头的子字符串。

最终的解决方案是

\\D

请参阅online Java demo

答案 2 :(得分:1)

$rootScope.$on('$stateChangeStart', function (e, toState, toParams, fromState, fromParams) {
     $rootScope.tabName  = fromState.name;          
 });

答案 3 :(得分:0)

Java的String#split方法将为两个分隔符之间出现的每个点创建一个标记。请考虑以下示例:

String s = "a,b,c,,,f";

由于分隔符,连续出现,中间没有任何内容,s.split(",")会产生以下输出:

{"a", "b", "c", "", "", "f"}

你会注意到这个数组中有两个空字符串;插入一个空格来表示在每对连续逗号之间出现的标记。基本上,该字符串被视为a,b,c,(blank),(blank),f

解决方法是将连续分隔符视为单个分隔符。现在,重要的是要记住你对split的论证实际上是一个正则表达式字面值。因此,您可以包含+贪婪的正则表达式量词来告诉引擎匹配一个或多个连续的分隔符,并将它们视为单个分裂点:

s.split(",+")

对于上面的示例,现在产生以下(无空字符串):

{"a", "b", "c", "f"}

您可以使用\\D+将相似的技术应用于正则表达式。