为什么这个正则表达式不能按我想要的方式工作?
问题描述:
我有像下面的'TextBoxKunde85_3_0'字符串,我只想提取数字部分(包括下划线)。 我创建了以下的正则表达式:为什么这个正则表达式不能按我想要的方式工作?
/^\w+(\d{1,2}_\d{1,2}_\d{1,3})$/
但是对于例如我提供它上面retunrns“5_3_0”而不是“85_3_0”。我该如何解决?
答
这是因为\w
也符合数字和下划线。因此,吞下所有的输入,但在以“回馈”为正则表达式来满足:
# before matching
regex: |^\w+(\d{1,2}_\d{1,2}_\d{1,3})$
input: |TextBoxKunde85_3_0
#^
regex: ^|\w+(\d{1,2}_\d{1,2}_\d{1,3})$
input: |TextBoxKunde85_3_0
# \w+
regex: ^\w+|(\d{1,2}_\d{1,2}_\d{1,3})$
input: TextBoxKunde85_3_0|
# \d{1,2}: no... Must give back
regex: ^\w+|(\d{1,2}_\d{1,2}_\d{1,3})$
input: TextBoxKunde85_3_|0
# \d{1,2}: match
regex: ^\w+(\d{1,2}|_\d{1,2}_\d{1,3})$
input: TextBoxKunde85_3_0|
# _: no, give back
# etc etc
更换\w
与[a-zA-Z]
,它应该做的伎俩。
答
\w+(\d{1,2})
:第一个贪婪的globbing获胜。
这里\w+
会因此吃掉8
。
两个解决方案:
-
\w
后使用非贪婪的重复。 - 删除
^\w+
一部分:你不抓住它...
@fge - 为什么downvote? – 2012-01-18 14:11:27
@Lieven:投票是匿名的,你为什么认为它是@fge? – Benoit 2012-01-18 14:20:55
@Lieven由于滥用惰性量词 - 输入是“一个或多个字母,后跟一个或多个数字,后面是...”,因此输入可以用一种不需要懒惰的量词。这种构造被滥用,滥用和滥用。 – fge 2012-01-18 14:24:07