代码之家  ›  专栏  ›  技术社区  ›  Shouvik

请使用JavaReX帮助拆分字符串!如何忽略空行?

  •  0
  • Shouvik  · 技术社区  · 14 年前

    我是一个完整的noob regex和我需要帮助分裂一个字符串。我正在输入以下数据

    665  11% R     1    908K    388K  fg root     top
     61   1% S    42 152404K  29716K  fg system   system_server
     38   0% S     1    840K    340K  fg root     /system/bin/qemud
    114   0% S    16 120160K  19156K  fg radio    com.android.phone
    

    这只不过是你的常规最高产量。我要做的是在诸如

    655 11% R 1 fg root top
    

    现在,我用来执行以下操作的代码是

    while ((inputLine = in.readLine()) != null) 
    {
      String[] segs= inputLine.split("[ ]+");
      str[i] = segs[0]+" "+segs[1]+" "+segs[2]+" "+
               segs[3]+" "+segs[6]+" "+segs[7]+" "+segs[8];
      Log.v("TOP Output", str[i]);
      i++; j++;
    }
    

    但我面临的问题是,我上了logcat

    java.lang.ArrayIndexOutOfBoundsException
    

    我哪里出错了,我能做些什么来防止这种情况发生呢?谢谢你的帮助。

    编辑:在阅读了评论之后,我意识到我的输出中有一些空行。所以在这种情况下,我该如何忽略这些线呢?我知道我应该匹配一个案例,但我不确定表达式或语法!

    4 回复  |  直到 14 年前
        1
  •  3
  •   Tomalak    14 年前

    您不需要字符类(方括号)。空格是regex中的常规字符,因此:

    String[] segs = inputLine.split(" +");
    

    除此之外, 假设 数组索引存在而没有范围检查是错误的样式和 ArrayIndexOutOfBoundsException 正是你所要求的。

    最好明确地做:

    String re = "^\\s*(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\s+(\\S+)\\s+(\\S+)\\s*$";
    Pattern p = Pattern.compile(re, Pattern.MULTILINE);
    Matcher m = p.matcher(yourInputString);
    
    while (m.find())
    {
       // do stuff with m.group(1) through m.group(9)
    }
    

    这样就可以保证你匹配的每一行都符合你的期望,并且每一个匹配者组也包含你期望的内容。

    免责声明:我不是特别为那个雷杰克斯骄傲。实际上,这是一个相当难看的问题,但它说明了一点,即显式比隐式更可靠和更可预测。它有潜力被改进成比字符串拆分更精确地匹配所需部分的版本。

        2
  •  2
  •   naikus    14 年前

    使用下面的regexp,并检查数组的长度,每行! 还可以考虑使用StringBuilder或StringBuffer,而不是连接。

     String[] s = inputLine.split("[\\s\\t]+");
    
        3
  •  2
  •   Alan Moore Chris Ballance    14 年前

    这个输出有多一致?每一列中是否总是有一个值?如果是,请尝试:

    line = line.replaceFirst("(?:\s+\d+[KM]?){3}", "");
    

    这种方法不必担心空行,因为regex不匹配空行。

        4
  •  0
  •   m88    14 年前

    在str实例化时要小心,它有多大,因为它是一个数组。您应该使用一个列表或其他任何东西,因为您不知道您的输入中有多少行。