我有一个带有数字的字符串:
dfdf00023546546
我想只得到这个号码:
(0*)(\d+) works
(0*)(\d*) doesn't work
(0*)(\d*$) works
如果加号表示1或更多且星号表示0或更多,则不是*假设捕获超过+?为什么添加$符号可以使它工作?
由于
答案 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*$)
只有在匹配位于字符串末尾时才会起作用。