如何创建一个“逐步匹配”的正则表达式?

7

我需要一个正则表达式,可以在用户输入时匹配字符串。有点难以解释,让我展示一下我的意思:

它应该匹配这个字符串:

"XXXX units",其中 XXXX 是任何数字。

但它也应该匹配从该字符串开头的任何子字符串,所以:

"123"
"123 u"
"123 uni"

也应该匹配。

但是,当然,这不应该匹配:

"123 xx"

这看起来很简单,但我还是无法完全弄清楚。这是我能想到的最接近的答案:

^\d+ ?u?n?i?t?s?

...但不幸的是,它也匹配类似于“123us”这样的字符串。

有人能帮忙吗?这是JavaScript代码,所以我可能受到缺失look behind/ahead功能的限制...


@CodeiSir - 这也会匹配类似于“123 us”的东西,但它不应该... :) - Zissou
^\d+ (u(n(i(t(s)?)?)?)?)?$ - CoderPi
请访问http://stackoverflow.com/questions/33213891/regex-for-dates-that-matches-for-every-stage-of-valid-date-entry/33215086#33215086。 - user663031
3个回答

8

只需添加一些()

/^\d+( (u(n(i(t(s)?)?)?)?)?)?$/

测试:

/^\d+( (u(n(i(t(s)?)?)?)?)?)?$/.test("123 units")  -> true
/^\d+( (u(n(i(t(s)?)?)?)?)?)?$/.test("123 un")     -> true
/^\d+( (u(n(i(t(s)?)?)?)?)?)?$/.test("123 ui")     -> false
/^\d+( (u(n(i(t(s)?)?)?)?)?)?$/.test("12")         -> true
/^\d+( (u(n(i(t(s)?)?)?)?)?)?$/.test("123 xx")     -> false

1
是的,它确实可以,不是吗;-) 您还可以按空格拆分,在第一部分上匹配\d+,在最后一部分上匹配"units".indexOf(...)==0 - Kenney

1

这不太好看,但它完成了工作...

^(\d+( (u(n(i(t(s)?)?)?)?)?)?)?$

你漏掉了末尾的 $ - 这样也会匹配 123 xx - Kenney
很好,这个比看起来更棘手 :) 无意识的一致性似乎是关键。现在已经修复了。 - Thomas

1

也匹配没有空格的“123units”。不匹配空字符串(这显然是一个有效的前缀)。 - Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接