2016-10-17 84 views
1

我写了这个简单的程序,它在每个非数字字符处分割一个给定的输入。字符串分割错误的输出

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 

为什么那么多多余的空格出现?我需要在一个单独的行上打印每个数字,而没有间隔。我怎样才能解决这个问题?

+7

使用'\\ d +'图案。但是,如果您的字符串以非数字开头,则仍然可以保留前导空元素。 –

回答

1
//Declarations 
     String[] temp; 
     String current; 

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

它工作!如果我把!temp [i] .equals(“”)不起作用。但是,如果我把!temp [i] .equalsIgnoreCase(“”)。有什么不同?你可以解释吗? –

+0

我的坏...它的工作**!temp [i] .equals(“”)**也...没有尝试过......无论如何,谢谢:) –

4

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

为了治疗的非数字字符的字符串作为一个分隔符,指定

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

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

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(",+") 

对于上面的例子中,这个现在得到以下(SANS空字符串):

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

您可以将类似的技术,以您正则表达式,使用\\D+

1

总之,使用

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

分割字符串以\D(非数字字符匹配图案)指您一次匹配单个非数字字符,并在该打破串焦炭。当你需要拆分对块字符的,你需要匹配多个连续字符,并在你的情况,你只需要\\D后添加+量词

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

最终溶液是

List<String> strs = Arrays.asList("hello1world2", "world3", "end4of5world6"); 
for (String str : strs) { 
    System.out.println("---- Next string ----"); 
    String[] temp = str.replaceFirst("^\\D+","").split("\\D+"); 
    for (String s: temp) { 
     System.out.println(s); 
    } 
} 

参见online Java demo