JavaScript正则表达式:复杂的输入验证

时间:2010-06-15 23:27:18

标签: javascript regex

我正在尝试构建一个正则表达式来组合使用范围来筛选有效的部分和/或序列号。

有效的部件号是两个alpha,三位数的模式或/ [A-z] {2} \ d {3} /

i.e. aa123 or ZZ443 etc...

有效的序列号是五位数模式,或/ \ d {5} /

13245 or 31234 and so on.

那部分不是问题。我希望组合和范围也有效:

12345, ab123,ab234-ab245, 12346 - 12349 - 最终目标。以任意组合范围和/或系列部件和/或序列号。请注意,在指定范围或系列中的逗号后,空格是可选的。请注意,一系列零件编号在范围的两边都有相同的两个字母组合(即 ab 123 - ab 239)

我已经和这个表达了两天了,并没有提出比这更好的东西:

/^(?:[A-z]{2}\d{3}[, ]*)|(?:\d{5}[, ]*)|(?:([A-z]{2})\d{3} ?- ?\4\d{3}[, ]*)|(?:\d{5} ?- ?\d{5}[, ]*)$/

...

My Regex-Fu很弱。

2 个答案:

答案 0 :(得分:1)

您可能不希望使用正则表达式执行此操作。如果您只有逗号分隔的部件/序列号列表(可选择范围),则可能更容易:

split input on commas
for each input:
   if there is a dash:
       split on a dash, strip each element to remove whitespace
       make sure each side is a part or a serial number (can use 2 regexes here)
       if they're part numbers, make sure they start w/ the same two letters
   else:
       strip to remove whitespace, make sure is a valid part or serial number

如果一切都过去了,那么输入是正确的。

答案 1 :(得分:1)

首先,[A-z]是错误的。除了字母之外,它还将匹配方括号,反斜杠,插入符号,下划线或反引号 - 所有字符位于ASCII字符集中的大写字母和小写字母之间。您应该使用不区分大小写的选项[A-Za-z][A-Z]

要匹配单个序列号或一系列序列号,请执行以下操作:

/\d{5}(?:\s*-\s*\d{5})?/

...以及零件编号:

/([A-Z]{2})\d{3}(?:\s*-\s*\1\d{3})?/i

在你的正则表达式中,你使用了\4,但这是错误的。它可能是与第一个部件号中的字母匹配的第四个,但它只是第一个捕获组,因此您应该使用\1

将它们放在一起以匹配整个系列,你有

/(?:\b(?:\d{5}(?:\s*-\s*\d{5})?|([A-Z]{2})\d{3}(?:\s*-\s*\1\d{3})?)(?:,\s*)?)+/i

逗号必须是可选的,但这意味着正则表达式可能会错误地匹配123451234512345ab123之类的序列。不太可能发生这种情况,我添加了边界(\b)来覆盖它。两个序列号/部件号/范围之间必须至少有一个非单词字符,(?:,\s*)?表示只能是逗号和可选空格。您的[, ]*将允许任意数量的空格和/或逗号,或者根本不允许任何内容。