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

Why is this pattern not working with knockout validation? (delimited zip codes)

这显然适用于我能找到的每个正则表达式测试器,以及 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?)*)+/ } });

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

the most I get is validating the first 5 are numeric

我认为,从标题来看,您需要一个逗号分隔的邮政编码列表,这样您链接的正则表达式测试就会因为字母字符而失败。

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

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

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

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

最后,对于两个正则表达式(space-padded 或 space-removed),如果您想控制列表中可以包含多少个邮政编码,您可以将末尾的星号更改为一组数字。

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

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

最后,无论如何,如果你想匹配整个字符串,你可能会这样做,你应该用 ^$ 包装它(分别是字符串的开始和结束),比如所以 ^(\d{5})(,\d{5})*$

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

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

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

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