使用所有格正则表达式运算符匹配 Java DecimalNumeral

Matching Java DecimalNumeral using possessive regex operators

Java 十进制数应以非零数字开头,后跟任意数字或下划线,最后以数字结尾。我们可以写下面的正则表达式来捕获它们:

[1-9][0-9_]*[0-9]

(请注意,这不是完整的正则表达式,还有两个与此问题无关的备选方案:[0] | [1-9][0-9]*)

这个正则表达式可以正常工作。然而,由于 * 是贪婪的,它会回溯,在这种情况下至少总是回溯一个字符以匹配最后一位数字。有什么方法可以使用不使用回溯的所有格 * (*+) 重写这个例子吗?或者是否有任何不需要回溯的等效正则表达式?使用 lookahead 等其他高级功能没问题,我只是不想回溯。

PS。我知道你们中的许多人可能认为 * 与 *+ 相比的性能不是一个真正的问题以及我为什么需要这个,但我并不关心性能。我想知道是否存在此正则表达式的确定性版本。

这是您想要的正则表达式的状态机(最终状态为 1):

on    | transitions
------+--------------
[1-9] | 0-1
[0-9] | 1-1, 2-1
_     | 1-2, 2-2

正则表达式:

[1-9](?:_*[0-9])*

不过,它与您提供的表达式不匹配 0