为什么这种模式不适用于敲除验证? (分隔邮政编码)

时间:2015-02-15 17:40:30

标签: javascript regex knockout.js knockout-validation

这清楚地适用于我能找到的每个正则表达式测试程序,以及jquery验证和MVC属性。我错过了什么?我已经尝试了文字以及RegExp,但我得到的最多的是验证前5个是数字,但除此之外,其他任何事情都失败了。

例如: https://regex101.com/r/gS0wP0/1

regex: /(\d{5}(\s?)*,?(\s?)*)+/

ko.observable().extend({ pattern: { message: 'Test Message', params:/(\d{5}(\s?)*,?(\s?)*)+/ } });

2 个答案:

答案 0 :(得分:1)

我不清楚你要在这里完成什么。你说

  

我得到的最多是验证前5个是数字

我认为,从标题中,您想要一个逗号分隔的zipcodes列表,因此您链接的正则表达式测试应该因字母字符而失败。

我认为这个正则表达式可能适合你

\s*(\d{5})\s*(,\s*\d{5})*

它有点慷慨的间距,但老实说,我会先在字符串上运行正则表达式替换以消除空格。这看起来像string.replace(/\s+/g,""),然后你的正则表达式看起来像这样。

(\d{5})(,\d{5})*

最后,如果你想控制列表中可以包含多少个zipcodes,你可以使用两个正则表达式(空格填充或空格删除),将末尾的星号更改为数字集。

如果你想要1-5个zipcodes,你会说(\d{5})(,\d{5}){0,4}。如果您想要3-6个邮政编码,您会说(\d{5})(,\d{5}){2,5},请注意,范围编号比您想要的范围小1,因为正则表达式的第一部分需要1。

如果您只想要2个或更多,您可以将最终的星号更改为+

最后,在任何情况下,如果你想匹配你可能做的整个字符串,你应该用^$(分别是字符串的开头和结尾)包装它,就像这样{ {1}}

答案 1 :(得分:1)

ASP.NET MVC中使用的RegularExpressionAttribute隐式检查从第一个索引开始的全长匹配。

因此,它实际上是将您的模式转换为:/^(\d{5}(\s?)*,?(\s?)*)+$/

然而,KO验证仅使用提供的模式而没有任何其他逻辑,您需要手动添加^$以匹配整行:

ko.observable().extend({ 
    pattern: { 
       message: 'Test Message', 
       params:/^(\d{5}(\s?)*,?(\s?)*)+$/ } 
});