Milk+ea

Weblog Is My Hobby.

JavaScriptの正規表現にある「先読み」と「否定先読み」

JavaScript正規表現にこんなのがあります。

123(?=456)    // 先読み
123(?!456)    // 否定先読み

先読み

これは123の後に456が続く場合・・・123456123にマッチします。

'123456'.match(/123(?=456)/)     // -> ["123"]
'123'.match(/123(?=456)/)        // -> null
'1234'.match(/123(?=456)/)       // -> null
'1234567'.match(/123(?=456)/)    // -> ["123"]

否定先読み

これは123の後に456が続かない場合・・・1231234にマッチします。

'123456'.match(/123(?!456)/)     // -> null
'123'.match(/123(?!456)/)        // -> ["123"]
'1234'.match(/123(?!456)/)       // -> ["123"]
'1234567'.match(/123(?!456)/)    // -> null

ちょっと普通の文字列で使ってみます。

'JavaScript'.match(/Java(?=Script)/)    // -> ["Java"]
'JavaScript'.match(/Java(?!Script)/)    // -> null

勘違いでした。

頭につけると意味が逆になるの?

'SCSS'.match(/(?=S)CSS/)    // -> null
'SCSS'.match(/(?!S)CSS/)    // -> ["CSS"]

前に「否定先読み」付けて、CSSの前にSが付いているのにマッチング。


こんなこともできるみたい。

'JavaScript'.match(/Java(?=Script)....../)    // -> ["JavaScript"]
'SCSS'.match(/.(?!S)CSS/)                     // -> ["SCSS"]