正则表达式数字范围1-17。

4
有人能告诉我如何使用正则表达式匹配1-17之间的数字吗?
我尝试了[1-9]|1[0-7],但它会匹配到18中的8,因为第一部分匹配了1-9。
有什么想法吗?我不想要前导零。
编辑:
问题是我正在尝试验证英国邮编,比如以以下方式开始:
KW1-17(可以是KW1、KW2直到KW17)......这只是外部部分。邮编可能是KW15 1BM或KW151BM,所以我不能只使用锚点来匹配整个字符串......这变得更加复杂。

这也许对你有所帮助:https://dev59.com/THVC5IYBdhLWcg3w2lCI - 03Usr
1个回答

10

您需要在正则表达式周围放置锚点,否则它将匹配子字符串:

^(?:[2-9]|1[0-7]?)$

我还自作主张地让你的正则表达式更加高效:

两个正则表达式的比较


我只是想知道这样做更高效的原因是什么?你运行了哪些测试来确定这一点? - AlanFoster
@AlanFoster:它避免了在数字10-17上的回溯。在原始正则表达式中,交替的第一部分将匹配1,然后由于无法匹配$,因此匹配失败,因此引擎必须回溯到交替的第二部分才能成功。通过从第一部分中删除1,就不再需要回溯了。 - Tim Pietzcker
@AlanFoster:我已经添加了一个RegexBuddy调试截图来可视化这个问题。 - Tim Pietzcker
1
我从来不知道那个程序的存在。我已经为你的答案点赞,因为它对我很有用。谢谢。 - AlanFoster
你可以使用 (?<!\d)(?!\d) 来代替 ^$,以确保它不是数字的前缀或后缀。这假定你正在使用支持回顾和预测的正则表达式。 - MRAB

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