一度に大きな正規表現を構築したくはありません。読むのが難しく、維持するのが難しいでしょう。また、休暇中にカンクンでビーチでマルガリータをすすりながらデバッグをしなければならないとき、仲間の開発者はあなたを嫌うでしょう。
したがって、明確で意味のあるチャンクに分割することをお勧めします (ここで判断する必要があります。それはあなたのドメインです)。多分このようなもの。
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