我刚刚审查完一些代码,这是一个正则表达式,从最宽松的意义上来说,它是从字符串中“解析”了相当多的数字。
简单的例子是:
^([0-9]{1}) ([0-9]{2}) ([0-9]{1}) .... and so on$
如果我没记错的话,应该匹配“3 4 5 ..... 等等”。
由于在字符串中检查的数字数量以及我所指的字符串的复杂程度,看起来正则表达式确实可能是匹配的正确方法,但是当尝试提取数字时,代码作者必须使用匹配器组对以下方法进行多次调用:-
Integer.parseInt(matcher.group(index))
如果明确告诉正则表达式引擎捕获仅包含 0-9 {1-2} 的组,是否没有办法显式捕获正确的类型以免再次解析?在这种情况下,是否应该在不使用正则表达式的情况下匹配模式,具体取决于模式的复杂程度?也许我对正则表达式组匹配器的工作原理的理解并不完整。
其他语言支持这个吗?
我认为,如果我如此倾向于“挤出”最后一点性能,那么在没有错误检查分支的情况下实现轻量级的 parseInt 将会略微提高性能。查看 parseInt 方法,有相当多的用于错误检查的分支,在正则表达式匹配后可能不需要这些分支
最佳答案
一个可以做你想做的一切的例程或类可能用起来很愉快,但很难维护或灵活使用。这里的设计问题是关注点分离,即可以独立更改的信息应该在程序内分离的原则。
正则表达式解析器的关注点是将输入字符串的各个部分识别为预期模式的元素。将这些字符串部分转换为其他 Java 数据类型是一个单独的问题。当然,匹配 ([0-9]*)
的组可能(但不确定)最好用数字类型表示,但是哪种数字类型呢?类型转换可以单独完成。
在程序设计中,您可能会将输入字符串转换为某种复杂的数据类型。您可以将其封装在单个类或方法中,这样对于程序的其余部分来说,这就是一个步骤。但对于 Java 平台来说,充分预测您的需求来为您做到这一点是不切实际的。
关于java - 为什么无法在正则表达式匹配器中返回类型化组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42946303/