我有一个包含数字和字母的字符串。我希望将字符串拆分为连续的数字 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/