プログラマー探偵の事件簿: Invalid regular expression: invalid group specifier name
開発中のプログラムを念のため他の環境でも試した時、思いもよらず全く動作しないことがある。今回は、そんな経験の話だ。助手の猫は「似たようなパッケージ、材料、味の表記のレトルトのご飯でも食べてみないと違いが分からないのと同じ!」と言っているがピントがずれている気がする。
問題のはじまり
Webブラウザーで表示する設定画面を作っていた時、入力チェックのために
のライブラリを組み込んだ。Google Chromeブラウザーでは問題なく思った通りの動きをしている。念の為、Safariでも試してみた。あれ、今まで動作していた部分も含めて全く動かない。
手がかりを探せ
JavaScriptに関連した問題の調査はブラウザーの開発者画面を使うのが定番。Safariなら
のメニューから表示する。
案の定エラーがでている。どれどれ、
SyntaxError: Invalid regular expression: invalid group specifier name
Googleに聞いてみる
まずは、Google翻訳してみる。
文法エラー:無効な正規表現:無効なグループ指定子名
正規表現に関するエラーらしい。検索してみる。
沢山あるが最初のがドンピシャ!
Chromeで動作するがSafariだと止まる。なるほど、Safariは、正規表現の lookbehind(後読み)に対応していないためエラーになる。
解決のための準備
開発中のプログラムは規模が大きいので修正して確認するまでの時間が長くなってしまう。この問題の解決のための試行錯誤には効率的ではない。こういう場合は「問題部分だけを取り出したテストプログラムを作るのが一番」と考えていると、助手の猫が「にゃー」と同意してくれた。
のようなテストプログラムを作って同じ問題を再現した。
ソースコードを調べる
問題が単純になったので、ソースコードを見てみる。問題の場所は、
からわかる。どれどれ、2274行目
'bs-BA': /^((((\+|0{2})3876)|06)[0-6])((?<=4)\d{7}|(?<!4)\d{6})$/,
正規表現が書いてある。どうやら電話番号の形式をチェックするための正規表現のようだ。ここを修正すれば解決するはず。
まじめに修正すべきか?
問題の行を正規表現のlookbehindを使わずに修正することが正しい方法だ。でも、ほんとに正しい方法なのか?
もう一度、問題の行を見てみる。bs-BAは、言語コードがbs,国コードがBA(ボスニアヘルツェゴビナ)の電話番号のチェックのようである。日本のja-JPの行もある。
'ja-JP': /^(\+81[ \-]?(\(0\))?|0)[6789]0[ \-]?\d{4}[ \-]?\d{4}$/,
はたして、ボスニアヘルツェゴビナの電話番号チェックがいるのだろか?と考えている時、猫が「時間の無駄だ、はやく終わらせて抱っこしろ」と言った。
えい
コメントアウトして解決!
ボスニアヘルツェゴビナの電話番号チェックの方法は謎のままである。
開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。