为什么没有办法在正则表达式匹配器中返回类型化组?

时间:2017-03-22 08:30:43

标签: java regex

我刚刚完成了一些代码的审核,这是一个正则表达式'解析',在最松散的意义上,从字符串中得到一些数字。

简单的例子是:

^([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方法,在正则表达式匹配后可能不需要进行错误检查的一些分支

2 个答案:

答案 0 :(得分:1)

能够做到你想要的一切的例程或课程可以很愉快地使用,但很难维护或灵活使用。这里的设计问题是关注点分离,即可以在程序中分离可以独立更改的信息的原则。

正则表达式解析器的关注点是将输入字符串的各个部分标识为预期模式的元素。将这些字符串部分转换为其他java数据类型是一个单独的问题。当然,匹配([0-9]*)的组可能(但不确定)最好用数字类型表示,但是哪种数字类型?类型转换可以单独完成。

在程序设计中,您可能会将输入字符串转换为某种复杂的数据类型。您可以将其封装在单个类或方法中,这样对于程序的其余部分来说,这只是一个步骤。但是,对于Java平台而言,预测您的需求足以为您做到这一点是不切实际的。

答案 1 :(得分:1)

为匹配的内容确定合适的类型是词法分析的一部分(创建编译器的第一步),而且它不是正则表达式引擎的工作。进行词法分析的工具称为词法分析器或标记器。

如果你想进行词法分析,你有一个StreamTokenizer in Java,但它非常有限。如果我需要词法分析器,我会使用JFlex或类似的东西,或者自己动手,取决于项目。