【问题标题】:Regular expression, plus vs asterisk [duplicate]正则表达式,加号 vs 星号 [重复]
【发布时间】:2018-03-25 10:56:36
【问题描述】:

我有一个字符串,里面有一个数字:

dfdf00023546546

我只想得到号码:

(0*)(\d+) works
(0*)(\d*) doesn't work
(0*)(\d*$) works 

如果加号表示 1 或更多,星号表示 0 或更多,* 不应该比 + 捕获更多吗?为什么添加 $ 符号会起作用?

谢谢

【问题讨论】:

  • 我无法重现问题
  • 所有版本都可以正常工作(如果使用得当)。

标签: javascript regex


【解决方案1】:

你的问题是g 模式可能没有设置。如果您设置此全局模式,您将看到expected substring is matched。

此(0*)(\d*) 匹配但在g 模式下返回两个以上的组,因为这两个模式都是*-quantified,其中包括零长度匹配。

+ 量词表示至少出现一次前面的标记,因此它会查找必须存在的东西。话虽如此,它不会返回零长度匹配。

您的第三次尝试(0*)(\d*$) 与+ 量词的作用相同,因为零长度匹配不能早于遇到输入字符串结尾的数字。但是,使用此正则表达式,当 g 模式打开时,末尾会有一个零长度匹配。

【讨论】:

    【解决方案2】:

    这可能很难理解,但你的正则表达式会有点如下:

    • (0*)(\d+) 将返回一个匹配 00023546546。
    • (0*)(\d*$) 将返回 2 个匹配项 00023546546 和 字符串结尾{empty}。第二个匹配是因为它必须检查零或 0 的更多出现 - 可以是 {empty} 和零或更多 出现 0-9 之间的数字 - 又可以是 {empty} 和字符串检查的结尾。
    • 另一方面,(0*)(\d*) 在 6 个不同的位置检查 - 在每个字母之前,因为根据您的正则表达式,从技术上讲,匹配可以是 {empty}。一个非空匹配项将返回您的数字,一个字符串匹配项的结尾再次为空。

    【讨论】:

      【解决方案3】:

      请记住,正则表达式不仅会匹配字符,还会产生长度为 0 的匹配项。

      (0*)(\d*)其实有效,只是它匹配你想要的东西加上一些空匹配:

      [ '', '', '', '', '00023546546', '' ]
      

      看到那些长度为 0 的匹配项了吗?

      现在我将解释为什么会有那些 0 长度的匹配。您的正则表达式说应该有 0 个或多个 0s,后跟 0 个或多个数字。这意味着它可以匹配 0 个0s 和 0 个数字,不是吗?所以每个字符之间的空格都是匹配的,因为“子字符串”正好有 0 个 0s 和 0 个数字!

      顺便说一句,(0*)(\d*$) 仅在匹配位于字符串末尾时才有效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-29
        • 2012-01-24
        • 2018-03-07
        • 1970-01-01
        相关资源
        最近更新 更多