我使用正则表达式有一段时间了 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})
最佳答案
你可以这样做:
^(?:\d{4,5}\w{0,2}(?:\.\w{1,2})?|\w{3}-\d{6})$
我只是使用了替代运算符 (|
) 在旧格式和新格式之间进行拆分。
请注意,您的原始正则表达式 ([0-9]{4,5}[\.?\w*]{0,4}
) 可能有一个问题:[\.?\w*]
表示 .
或 ?
或 单词字符 或 *
,这似乎不是你所追求的。我根据您的示例使其更加严格,但您可能需要对其进行调整。
此外,请注意 \w
在 JS 中表示 [0-9a-zA-Z_]
- 这可能不是您想要的(尤其是下划线).
关于javascript - 匹配标准和离群值输入的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27951545/