Java 十进制数应以非零数字开头,后跟任意数量的数字或下划线,最后以数字结尾。我们可以编写以下正则表达式来捕获它们:
[1-9][0-9_]*[0-9]
(请注意,这不是完整的正则表达式,还有两个与此问题无关的替代方案:[0] | [1-9][0-9]*)
这个正则表达式有效并且没问题。然而,由于 * 是贪婪的,所以它会进行回溯,在这种情况下,至少总是返回一个字符来匹配最后一位数字。有没有办法使用所有格 * (*+) 重写这个示例,而不使用回溯?或者是否有任何等效的不需要回溯的正则表达式?使用其他高级功能(例如前瞻等)很好,我只是不想回溯。
PS。我知道你们很多人可能认为 * 与 *+ 相比的性能并不是真正的问题以及为什么我需要这个,但我并不关心性能。我想知道这个正则表达式是否存在确定性版本。最佳答案
这是您想要的正则表达式的状态机(最终状态为 1):
on | transitions
------+--------------
[1-9] | 0-1
[0-9] | 1-1, 2-1
_ | 1-2, 2-2
正则表达式:
[1-9](?:_*[0-9])*
但它与您提供的表达式不匹配 0
。
关于java - 使用所有格正则表达式运算符匹配 Java DecimalNumeral,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31194886/