【问题标题】:How can I check if at least one of two subexpressions in a regular expression match?如何检查正则表达式中的两个子表达式中的至少一个是否匹配?
【发布时间】:2008-10-06 13:55:55
【问题描述】:

我正在尝试用正则表达式匹配浮点十进制数。小数点前可能有也可能没有数字,小数点可能存在也可能不存在,如果存在,它后面可能有也可能没有数字。 (对于此应用程序,不允许使用前导 +/- 或尾随“E123”)。我写了这个正则表达式:

/^([\d]*)(\.([\d]*))?$/

正确匹配以下内容:

1
1.
1.23
.23

但是,这也匹配空字符串或仅包含小数点的字符串,这是我不想要的。

目前我在运行正则表达式后检查 $1 或 $3 的长度是否大于 0。如果不是,则它无效。有没有办法可以直接在正则表达式中做到这一点?

【问题讨论】:

  • 我实际上是用 Java 做的,但我把它贴在这里就好像它是 Perl 一样,因为 Java 的正则表达式引擎是对人类尊严的侮辱。

标签: regex syntax


【解决方案1】:

我认为这会做你想要的。它要么以数字开头,在这种情况下,小数点和后面的数字是可选的,或者以小数点开头,在这种情况下,它后面必须至少有一个数字。

/^\d+(\.\d*)?|\.\d+$/

【讨论】:

  • 什么抱歉正则表达式引擎不支持+?如果您确定支持 +,我冒昧地将代码更改为您应该拥有的代码。
  • 我在考虑一些版本的 grep、sed 和 ed,但最初的发布者可能使用的是更新的版本。这是你会在那些从不使用 GNU 工具的 Unix 系统开始的人身上看到的习惯之一。我还使用 zcat 而不是 -z 选项来 tar。
【解决方案2】:

为每种情况创建一个正则表达式,然后对它们进行 OR。那么你只需要测试表达式是否匹配。

/^(\d+(\.\d*)?)|(\d*\.\d+)$/

【讨论】:

    【解决方案3】:

    一个很晚的答案,但喜欢回答,取自regular-expressions.info

    [-+]?[\d]*\.?[\d]+?
    

    更新这个[\d]*\.?[\d]+?|[\d]+\.将帮助你匹配1.

    http://regex101.com/r/lJ7fF4/7

    【讨论】:

    • 无法匹配1.,我需要认为它在我的应用程序中有效。
    • 现在你已经重写了我原来的正则表达式。 :) 它匹配空字符串和.,这是我试图解决的问题。我认为没有“或”条件是不可能的。
    • @Kip 可能就是你所期待的[\d]*\.?[\d]+?|[\d]*\. 我尝试了OR 条件
    猜你喜欢
    • 2017-10-01
    • 2021-11-27
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    相关资源
    最近更新 更多