java - 帮助更好地解析 Java 中字符串中的数字

标签 java regex string readability literate-programming

我有一个包含数字和字母的字符串。我希望将字符串拆分为连续的数字 block 和连续的字母 block 。

考虑字符串“34A312O5M444123A”。

我想输出: ["34", "A", "312", "O", "5", "M", "444123", "A"]

我的代码看起来像这样:

List<String> digitsAsElements(String str){
  StringBuilder digitCollector = new StringBuilder();

  List<String> output = new ArrayList<String>();

  for (int i = 0; i < str.length(); i++){
    char cChar = str.charAt(i);

    if (Character.isDigit(cChar))
       digitCollector.append(cChar);
    else{
      output.add(digitCollector.toString());
      output.add(""+cChar);

      digitCollector = new StringBuilder();
    }         
  }

  return output;
}

我考虑过将 str 拆分两次以获得一个包含所有数字 block 的数组和一个包含所有字母 block 的数组。然后合并结果。我回避了这一点,因为它会损害可读性。

我有意避免使用正则表达式模式解决此问题,因为我发现正则表达式模式是可读性的主要障碍。

  • 调试器不能很好地处理它们。
  • 他们打断了阅读源代码的人的流程。
  • 加类正则表达式有机地成长并成为怪物。
  • 他们非常不直观。

我的问题是:

  • 如何提高上述代码的可读性?
  • 有更好的方法吗?优雅地解决此问题的 Util 类。
  • 在使用 regEx 和编写与我上面所写内容类似的代码之间,您在哪里划清界线?
  • 如何提高正则表达式的可读性/可维护性?

最佳答案

对于这个特定的任务,我总是使用正则表达式而不是手写类似的东西。至少对我而言,您上面给出的代码比简单的正则表达式(在这种情况下为 (\d+|[^\d]+) 可读性差,据我所知可以看到)。

您可能希望避免编写超过几行的正则表达式。这些可能并且通常是不可读和难以理解的,但是它们可以被替换的代码也是如此!解析器几乎从来都不是漂亮的,你通常最好阅读原始语法而不是尝试制作生成的(或手写的)解析器的意义。正则表达式也是如此(恕我直言),它们只是对常规语法的简明描述。

所以,总的来说,我会说禁止正则表达式以支持代码,就像您在问题中给出的那样听起来是一个非常愚蠢的想法。而正则表达式只是一个工具,仅此而已。如果其他东西在文本解析方面做得更好(比如,一个真正的解析器,一些子字符串魔术等),那么使用它。但不要仅仅因为您对它们感到不舒服而放弃可能性 - 其他人应对这些可能性的问题可能更少,而且所有人都能够学习。

编辑:在 mmyers 发表评论后更新了正则表达式。

关于java - 帮助更好地解析 Java 中字符串中的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/952614/

相关文章:

java - 在 java 原生接口(interface)中调用 DeleteLocalRef

python - 使用 Python 正则表达式按后缀拆分

java正则表达式搜索替换问题

c - 复杂正则表达式的段错误 - Regex.h

java - 如何计算字符串中字符的出现次数?

java - 初始化 Jersey 资源中的数据库

Java/HtmlUnit - 如何从 HtmlImageInput 获取 HtmlImage?

java - 在 ListView 中加载多个图像

java - 字符串连接中带或不带大括号可选

java - 特殊的非 ASCII 字符显示为 ?打印 ArrayList 时