JavaScriptで正規表現のニガテを克服するための本は注意が必要

JavaScriptで正規表現のニガテを克服するための本は注意が必要

無料で読めるJavaScript本

Kindle Unlimitedの読み放題サービスで一番人気のJavaScriptの本がある。

本のタイトルは「何となくJavaScriptを書いていた人が一歩先に進むための本」

JavaScript中級者を目指す人向けの本で要点が体系的にわかりやすくまとめられているため人気がある。

続編の「JavaScriptの理解を深めた人がさらにもう一歩先に進むための本」も人気があり、たくさんダウンロードされている。

そして最近「JavaScriptで正規表現のニガテを克服するための本」というのが新たに発売された。

しかし、この本は前述のJavaScript本と比べわかりにくい箇所が多く、正規表現の記述が正確ではない箇所が見受けられるため注意が必要だ。

ドメインの正規表現の注意事項

Chapter 5. 正規表現実践編の5-3 URLの検索で下記のような正規表現が記載されている。

// 「hoge」 ドメインのみを対象とする(「www.」は任意扱い)
let exp = /^https?:\/\/(www\.)?hoge\.[\w/:%#\$&\?\(\)~\.=\+\-]+$/;
console.log(exp.test('https://www.hoge.co.jp/')); // true
console.log(exp.test('http://www.hoge.co.jp/')); // true
console.log(exp.test('https://www.fuga.co.jp/')); // false
console.log(exp.test('http://www.fuga.co.jp/')); // false
console.log(exp.test('http://hoge.co.jp/')); // true

問題なさそうに見えるがこれだとサブドメインがhogeの場合も検出されるため注意が必要だ。

let exp = /^https?:\/\/(www\.)?hoge\.[\w/:%#\$&\?\(\)~\.=\+\-]+$/;
console.log(exp.test('http://hoge.fuga.co.jp/')); // true

あと、この本ではvarではなくletが使用されているがletは環境によっては使用できないため参考書のサンプルで使用するのは好ましくない。

さらに\.[\w/:%#\$&\?\(\)~\.=\+\-]+となっているがドメインに記号が含まれることは通常はないので可読性を下げてまでこの書き方をする必要はない。

ちなみに現在は「.コム」のようなカタカナドメインというものもある。

日付の正規表現を単独使用時の注意

5-4. 日付の検索で下記の正規表現がある。

0?[1-9]|1[0-2]

これは日付の月の部分の正規表現として書かれているが単独で使用する場合は注意が必要だ。

例えばvar month=13に.testで判定するとtrueになる。

これは0?[1-9]部分の条件が0が0文字か1文字で1から9の数字を意味しているため13の1がマッチするためだ。

そのためこの場合は^0?[1-9]$にしなくてはならない。

var exp = /0?[1-9]|1[0-2]/;
var exp2 = /^0?[1-9]$|1[0-2]/;
var month = 13;
console.log(exp.test(month)); // true
console.log(exp2.test(month)); // false