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

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

本文关键字:分隔 邮政编码 验证 模式 不适用 适用于 为什么      更新时间:2023-12-06

这显然适用于我能找到的每一个regex测试程序,以及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?)*)+/ } });

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

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

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

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

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

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

我认为,从标题来看,您想要一个逗号分隔的邮政编码列表,这样您链接的regex测试应该会因为alpha字符而失败。

我认为这个正则表达式可能适用于

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

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

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

最后,使用这两个正则表达式(填充空格或删除空格),如果您想控制列表中的邮政编码数量,可以将末尾的星号更改为数字集。

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

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

最后,在任何情况下,如果您想匹配整个字符串(您可能会这样做),您应该用^$(分别是字符串的开始和结束)来包装它,就像^('d{5})(,'d{5})*$ 一样