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

标签 java regex backtracking

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/

相关文章:

java - 如何以编程方式查询 p2 存储库中的信息和工件?

java - toString 方法中应该包含什么,不应该包含什么?

Python:在字符串的每个字母字符后插入逗号

java - 需要帮助修复此代码的动态编程/递归使用 Java 计算最小硬币

java - 通过搜索堆转储以编程方式查找正在运行的 Java 应用程序的值等的 VisualVM 等软件的替代方案?

java - 获取文件哈希性能/优化

regex - SAS 在开始或结束表达式时删除指定的单词

python - 正则表达式匹配两个单词之间的多行文本,包括单词

java - 什么时候需要回溯?

java - 使用递归回溯时耗尽堆