你真的不想一次性构建一个大的正则表达式。它将难以阅读且难以维护。当你在坎昆度假,在海滩上啜饮玛格丽塔酒时,当你的开发人员同事不得不调试它时,他们会讨厌你。
所以我建议把它分解成清晰、有意义的块(你必须在这里使用你的判断:这是你的域)。也许是这样的。
var prefix = '([12]0[0-9] )';
var suffix = '( 0[0-9])';
// ? optionally matches the preceding item.
// And don't forget to escape backslashes when creating
// a regexp from a string.
var num1 = '\\d{2}-\\d{2}-\\d{3}-\\d{2}[- ]?W\\d';
var num2 = '[A-D] [0-9]{3} [A-L] [0-9]{3}[A-P][0-9]{2}';
var numbers = '(' + num1 + '|' + num2 + ')';
var pattern = '^(' + prefix + numbers + suffix + '|' + numbers + ')$';
// Instead of creating a large regexp literal all in
// one go, you can build up the regexp pattern from strings,
// and then use RegExp(pattern) to make a regexp instance.
var rx = RegExp(pattern);
现在您可以使用它rx
来匹配您输入的数字。随意使用更有意义的变量名。
但不要只是把它留在那里。这段代码急需一些测试。
var testcases = [
{
name: 'Number 1',
tests: [
{input: '14-36-085-17 W6', expected: true},
{input: '14-36-085-17-W6', expected: true},
{input: '14-36-085-17W6', expected: true}
]
},
{
name: 'Number 2',
tests: [
{input: 'D 096 H 094A15', expected: true}
]
},
{
name: 'Number 3',
tests: [
{input: '100 14-36-085-17W6 00', expected: true},
{input: '200 D 096 H 094A15 00', expected: true},
{input: '100 14-36-085-17W6', expected: false},
{input: '14-36-085-17W6 00', expected: false}
]
}
];
让我们试试我们的正则表达式。我只是在 Chrome 的开发者控制台中运行这些测试(F12为此)。
testcases.forEach(function(testcase){
console.log(testcase.name);
testcase.tests.forEach(function(test){
var result = rx.test(test.input);
console.log(test.input + ' result: ' +
(result ? 'match' : 'no match') +
(result === test.expected ? ' [pass]' : ' [**FAIL**]'));
});
console.log('');
});
和输出。
1号
14-36-085-17 W6 结果:匹配 [通过]
14-36-085-17-W6 结果:匹配 [通过]
14-36-085-17W6 结果:匹配 [通过]
2号
D 096 H 094A15 结果:匹配 [通过]
3 号
100 14-36-085-17W6 00 结果:匹配 [通过]
200 D 096 H 094A15 00 结果:匹配 [通过]
100 14-36-085-17W6 结果:不匹配 [通过]
14-36-085-17W6 00 结果:不匹配 [通过]
伟大的。进行测试让你有信心做出改变,并保证你在做的时候没有破坏任何东西。它让我相信我不会给你一个愚蠢的答案。如果您进行搜索,您会发现有许多自动化单元测试框架可以让您更轻松地编写测试。我给你的是一个基本的例子。但是,当您完全开始运行自动化测试时,就会获得巨大的胜利。之后的一切都是细化的。
顺便说一句,这些测试只是您在问题中提供的有效或无效示例(谢谢!)。我建议您找到更多示例并以此为基础。希望我已经给了你足够的指导,如果我所做的无论如何都不够,你可以从这里得到它。
对于正则表达式的答案,这似乎有点过头了,但我不能问心无愧地建议您使用巨大的正则表达式进行验证,而不推荐一些机器来保持事情的可管理性。
进一步阅读
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions
http://en.wikipedia.org/wiki/Unit_testing