【问题标题】:Regular Expression for matching number greater than specified decimal number匹配数大于指定十进制数的正则表达式
【发布时间】:2013-08-05 07:59:06
【问题描述】:

我想匹配大于 4.1 的版本号。 我为此构建了以下正则表达式

(([4-9]+\d*(\.((\*)|([2-9]+(\.((\*)|([0-9]+)))?)))?))

但它甚至匹配 '4' 而不匹配 '5.1'、'6.1' 等。

如何构造这样的正则表达式?请帮忙。

【问题讨论】:

    标签: regex string-matching


    【解决方案1】:

    试试这个:

    ([4-9]\.[2-9]\d*|[4-9]\.\d\d+|[5-9](\.\d+)?|\d\d+(\.\d+)?)
    

    匹配 4.1 以上的所有版本

    编辑:修复了不带点的版本

    【讨论】:

    • 如果在 C# 中使用该表达式会出现问题,因为在 C# 中,\d 甚至是非欧洲数字,例如 1234655567789...(非常丑陋的东西!)
    • @xanatos:我不知道,听起来像微软逻辑:D。好吧,没有给出具体的语言,我想如果他有这个问题,他可以将\d 切换到[0-9]
    • @xanatos - 每天学习新东西。有时我想收回我学到的东西:-(
    • 在 Python 中,如果你激活 re.UNICODE 它会做同样的事情 ideone.com/eQE2d2
    【解决方案2】:

    你可以试试这个:

    (4\.(1[0-9]*[1-9]|[2-9][0-9]*)|([5-9]|[1-9][0-9]+)(\.[0-9]+)?)
    

    这将匹配:

    • 4. 后跟:

      • 1 后跟零个或多个 0-9 和一个或多个 1-9
      • 2-9 后跟零个或多个 0-9

    • 5-91-9 后跟一个或多个 0-9
    • 后跟一个可选的小数点和零个或多个0-9

    根据这将如何使用,您可能需要考虑在您的模式周围添加开始/结束锚点,以便不允许其他字符:

    ^(4\.(1[0-9]*[1-9]|[2-9][0-9]*)|([5-9]|[1-9][0-9]+)(\.[0-9]+)?)$
    

    你可以测试一下here

    【讨论】:

    • 您需要转义第一个点。问题还要求版本greater than 4.1。你的匹配 4.1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 2012-10-02
    相关资源
    最近更新 更多