【问题标题】:Matching Java DecimalNumeral using possessive regex operators使用所有格正则表达式运算符匹配 Java DecimalNumeral
【发布时间】: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


【解决方案1】:

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

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

还有正则表达式:

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

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

【讨论】:

    猜你喜欢
    • 2014-05-06
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多