【发布时间】:2015-01-14 20:09:48
【问题描述】:
一段时间以来,我一直在使用 jQuery validation 的正则表达式,以确保我的用户输入有效的绘图名称字符串。在过去的一周里,我们增加了使用字符串有些不同的第 3 方设备的功能。我的任务是允许这些字符串以及之前的集合作为有效输入。我将它们发送给改编自 this SO answer 的验证器:
$.validator.addMethod("accept", function (value, element, param)
{
return value.match(new RegExp("^" + param + "$"));
});
请注意,我正在添加 ^ 和 $ 字符。
像这样:
drawingName: {
required: true,
accept: "[0-9]{4,5}[\\.?\\w*]{0,4}"
},
双反斜杠转义单反斜杠以在验证器中使用。如果您正在测试 http://www.rubular.com/ 之类的内容,则需要使用单反斜杠。
上一组(我对其进行了通用表示,其中“X”代表字母,“0”代表数字,小数点就是它们的含义)由以下有效可能性组成:
00000
00000.0
00000.00
00000.X
000000
000000X
00000X
00000X.0
00000X.0X
00000X0.0
00000XX.0
0000X.0
我的数据中有成千上万个这样的变体,不可能改变它们。该公司正在制定标准化命名法,但我们出售给客户的设备几十年来都可以返回维修、维护和校准:因此我们永远无法摆脱旧系统。
新的字符串变体如下所示:
XXX-0000
XXX-00000
XXX-000000
我已修改原始正则表达式以适应更改:[\\w{3}-]*\\d{4,5}[\\.?\\w*]{0,4}
我也尝试过\p{L}{3}?-?\d{4,6}\.?\w{0,2}\.?\w{0,2},但也出现了同样的问题(见下文)。
两者都有效,但在我的测试中,我注意到它们将允许在有效可能性的末尾添加看似无限数量的额外字符。 (我很确定旧的正则表达式允许相同类型的错误输入。)
因此,要捕获新字符串,我需要查找三个字母,后跟一个破折号,然后是四到六个数字(类似于:[\w{3}-]?\d{4,6}? 或 [/p{L}{3}-]?\d{4,6}?)...容纳以前的图纸名称,四到五位可能后跟一个字母,数字或一个小数点,可能后跟一个字母或数字,可能后跟一个数字或字母(令人困惑,是吗?) - 类似于这个:\d{4,5}[\.\w*]{0,4} 我认为这部分的问题在于w 后面的星号,但我不确定如何修复它或正确地将正则表达式的两个不同部分连接在一起。
我正在寻找的是一个单一的正则表达式,它允许我使用上述所有字符串变体筛选有效输入,但阻止无效输入。我知道我可以简单地添加另一个验证规则,这可能是我必须做的,但我想看看是否可以在单个正则表达式中完成。
编辑:
这是我在代码中使用的 Lucas 建议的最终解决方案,经过一些修改以不使用 \w,如下面他的回答中指出的那样:
(?:\\d{4,5}[0-9a-zA-Z]{0,2}(?:\\.[0-9a-zA-Z]{1,2})?|[a-zA-Z]{3}-\\d{6})
【问题讨论】:
标签: javascript jquery regex validation