【问题标题】:String Splitting wrong output字符串拆分错误输出
【发布时间】:2017-02-26 01:05:53
【问题描述】:

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

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

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

【问题讨论】:

  • 使用\\D+ 模式。但是,如果您的字符串以非数字开头,则可能仍会保留前导空元素。

标签: java arrays regex string


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:
    //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]);
                    }
                }
            }
    

    【讨论】:

    • 成功了!如果我输入 !temp[i].equals(""),它就不起作用。但是如果我输入 !temp[i].equalsIgnoreCase("") 就可以了。有什么不同?你能解释一下吗?
    • 我的错...它适用于 !temp[i].equals("") 也...没有尝试过...无论如何,谢谢: )
    【解决方案3】:

    简而言之,使用

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

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

    但是,这意味着如果您的字符串在字符串的开头有一个非数字,那么您在索引 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

    【讨论】:

      【解决方案4】:

      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+ 将类似的技术应用于您的正则表达式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多