【发布时间】:2015-07-02 21:23:32
【问题描述】:
Java 十进制数应以非零数字开头,后跟任意数量的数字或下划线,最后以数字结尾。我们可以编写以下正则表达式来捕获它们:
[1-9][0-9_]*[0-9]
(请注意,这不是完整的正则表达式,还有两个与此问题无关的替代方案:[0] | [1-9][0-9]*)
这个正则表达式有效,没问题。但是,由于 * 是贪心的,它会回溯,在这种情况下,至少总是回溯一个字符以匹配最后一个数字。有没有办法使用不使用回溯的所有格 * (*+) 重写这个例子?或者是否有任何不需要回溯的等效正则表达式?使用其他高级功能(例如前瞻等)很好,我只是不想回溯。
附言。我知道你们中的许多人可能认为 * 与 *+ 相比的性能不是一个真正的问题,为什么我需要它,但我并不关心性能。我想知道这个正则表达式的确定性版本是否存在。
【问题讨论】:
-
0和任何一位数字都是您的正则表达式不匹配的有效十进制数字。 -
@ericbn 谢谢,我更新了问题
-
也许
[1-9][0-9_]*+(?<!_)只需 1 个回溯步骤即可提供帮助。
标签: java regex backtracking