概要
- JavaScript の正規表現で flags の一部にブラウザ依存があり、それの回避方法を説明します。
Firefox で生じる問題
- 以下のコードは Google Chrome と Safari では動作しますが、Firefox では動作しません。
const str = `aaa
bbb
ccc`
str.match(/.{11}/s)
- 正規表現の説明。
- 正規表現中の
.
は、ディフォルトでは「改行以外の任意の一文字」にマッチします。 -
/.{11}/
は「11文字の長さの文字列」にマッチします。 -
/.{11}/s
の最後のs
は正規表現の flags で、「正規表現中の.
を、改行文字にもマッチさせる」と云う指定です。 -
aaa ... ccc
は、アルファベット9文字とaaa
とbbb
の後ろの改行を含めて11文字あります。
- 正規表現中の
原因
-
flags の
s
は比較的新しい仕様で、Firefox (v76.0.1) が未対応のため。
(2020/06/01 現在) -
Firefox の例外
const str = `aaa
bbb
ccc`
str.match(/.{11}/s)
// SyntaxError: invalid regular expression flag s
回避策
-
flags にm
を指定する。(複数行指定)
コメントでご指摘いただいた通り、不要でした。 -
.
の代わりに[^]
を使う。
const str = `aaa
bbb
ccc`
str.match(/[^]{11}/)
-
Q.E.D.
-
[^]
の意味が知りたい方は、最寄りの StewEucen までお尋ね下さいな。