我一直在使用正则表达式进行jQuery验证,以确保我的用户输入有效的字符串来绘制名称。 在过去的一周里,我们添加了使用字符串略有不同的第三方设备的功能。 我的任务是允许这些字符串以及前一个字符串作为有效输入。 我将它们发送给这个SO回答改编的验证器:

$.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})

#1楼 票数:2 已采纳

你可以这样做:

^(?:\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_] - 这可能不是您所追求的(特别是下划线)。

#2楼 票数:2

单一正则表达式

下面是一个简单的(相对于你的问题的规模),其占所提供的所有样品的输入单一的正则表达式-但 “允许将上涨到的有效可能性年底多余的字符看似无限多”:

^(\d{4}(\d([\dA-Z]|(\.(\d{1,2}|[A-Z]))|\d[A-Z]|[A-Z](\.\d[A-Z]?|[\dA-Z]\.\d))?|[A-Z]\.\d)|[A-Z]{3}-\d{4,6})$

正则表达式可视化

Debuggex演示

以下是使用提供的示例输入测试正则表达式的片段:

 var regex = new RegExp("^(\\\\d{4}(\\\\d([\\\\dA-Z]|(\\\\.(\\\\d{1,2}|[AZ]))|\\\\d[AZ]|[AZ](\\\\.\\\\d[AZ]?|[\\\\dA-Z]\\\\.\\\\d))?|[AZ]\\\\.\\\\d)|[AZ]{3}-\\\\d{4,6})$"); // tests for the sample inputs provided that are all expected to match var tests = [ '12345', '12345.6', '12345.67', '12345.A', '123456', '123456A', '12345A', '12345A.6', '12345A.6B', '12345A6.7', '12345AB.6', '1234A.5', 'ABC-1234', 'ABC-12345', 'ABC-123456' ]; for (var i = 0; i < tests.length; i++) { var result = "'" + tests[i] + "' => "; if (regex.test(tests[i])) { result += 'Yup!'; } else { result += 'Nope...'; } console.log(result); } 

合理

显然,顶级交替( | )是旧变种/新变体分裂的关键; 但我认为从旧的变体开始用\\d{4,5} (特别是{4,5}量词)是过度匹配困境的根源。

相反,从所有旧变体的共同点开始 - 四个开头数字(即\\d{4} ):这使您可以直接使用后续内部替换来匹配旧变体的前四个字符之外的差异。

细节

具体如下:

  • ^ - 输入字符串的开头
  • ( - 旧版本和新版本的第一级交替开始
  • \\d{4} - 所有旧变体开始的四位数
    • ( - 对于旧变体的主要分歧,开始第二级交替
    • \\d - 第五位数
      • ( - 可选分歧的第3级交替的开始,前五个字符是数字
      • [\\dA-Z] - 数字或字母
      • | - (第3级)
      • (\\.(\\d{1,2}|[AZ])) - 一个句号和1)一个或两个数字 2)一个字母
      • | - (第3级)
      • \\d[AZ] - 一个数字和一个字母
      • | - (第3级)
      • [AZ](\\.\\d[AZ]?|[\\dA-Z]\\.\\d) - 一个字母和1)一个句号,一个数字,可选一个字母 2)一个数字或字母,一个句号和一个数字
      • )? - 可选分歧的第3级交替结束,其中前五个字符是数字
    • | - (二级)
    • [AZ]\\.\\d - 一个字母,一个句号和一个数字
    • ) - 旧变种主要分歧的第二级交替结束
  • | - (一级)
  • [AZ]{3}-\\d{4,6} - 新版本
  • ) - 旧变种和新变种的第一级交替结束
  • $ - 输入字符串的结尾

上面的Debuggex图形以图解方式解释了所有这些,但是(某些)可能更容易遵循拼写。

可维护性

使用一个正则表达式处理如此多的变体自然会使可维护性成为一个挑战。

为了支持可维护性:

  1. 将我在上面的详细信息细分中显示的子模式分配给不同的字符串变量。
  2. 然后通过连接子模式的字符串来构建单个模式。

这样做的好处是允许您对每个子模式的字符串变量进行注释(就像我在详细信息细分中注释了每个项目符号)。

  ask by delliottg translate from so

未解决问题?本站智能推荐:

1回复

jQuery输入验证正则表达式

我有一个输入,可以接受这种格式的数据组合: dddd.nnnn 其中d是大写字母,n是数字。 在某些情况下,初始大写字母的长度可以是2,3或4。 然后一个。 (点)可以输入,之后只能输入数字(0 - 9)。 一些示例条目如下 可以通过组合正则表达式来完成吗?
1回复

使用正则表达式进行JavaScript输入验证

我想验证我的输入,因此用户只需输入字母即可。 问题是它只检查一个输入字段,但我选择all :input 码: 我感谢我能得到的一切帮助!
4回复

if语句的正则表达式

我有这个作为我的正则表达式: 这是我的if声明: 当我输入有效的电子邮件地址时,它会显示“OK”。 但是,如果我只输入一些文本,例如,当我想要“请输入有效的电子邮件地址”时,它仍然会显示“OK”。 有任何想法。 顺便说一下,我仍然是这个东西的主人!
3回复

jQueryPhone正则表达式验证

我在页面上有jQuery Validation插件。 当有人在表单字段中输入电话号码时,我希望验证器仅识别某种格式(ru): 我在.js文件中有这个: 这对我不起作用,有人知道为什么吗? 还是有更好的方法来做到这一点? :)
2回复

jQuery正则表达式验证

我想用一个小的jQuery函数在表单上验证onsubmit来验证用户输入客户端。 我希望字段#fname(名字)只允许包含az,AZ和空格。 返回false应该阻止表单提交。 这是我的HTML: 当然,稍后我将在服务器端验证用户输入。 当我提交表单时,它给我一个“内部服务器错误”。
1回复

需要正则表达式模式

我正在寻找正则表达式模式来验证数字,其中数字可以大于,但不能小于(-50)! 例: 谁能帮忙吗? 仅供参考,使用以下验证方法
4回复

基本正则表达式问题

我将其用作名称字段的验证正则表达式。 如何修改此设置以同时检查至少2个字符? 我这样使用它:
1回复

如何在jQuery中添加方法以将值与正则表达式匹配?

我正在使用Jquery验证插件来验证字段。 现在,我正在验证以学年为输入的文件。 我的意思是,它应该与2013-2014这样的值匹配。 为此,我编写了一个Jquery方法,如下所示: 在规则的验证方法中,我只有academicYear : {required : true}, 现在,