正则表达式,加上星号

时间:2018-03-25 10:56:37

标签: javascript regex

我有一个带有数字的字符串:

dfdf00023546546

我想只得到这个号码:

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

如果加号表示1或更多且星号表示0或更多,则不是*假设捕获超过+?为什么添加$符号可以使它工作?

由于

3 个答案:

答案 0 :(得分:1)

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

(0*)(\d*)匹配,但在g模式下返回两个以上的组,因为两种模式均为* - 量化,包括零长度匹配。< / p>

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

您的第三次尝试(0*)(\d*$)+量词的工作方式相同,原因是零长度匹配不能比满足输入字符串结尾的数字更早出现。但是,使用此正则表达式时,g模式打开时,最后会有一个零长度匹配。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

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

看那些0长度匹配?

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

顺便说一句(0*)(\d*$)只有在匹配位于字符串末尾时才会起作用。