正規表現で「肯定先読み」を使う

Pocket

JavaScriptを使って、次の作業をしたいと思います。

文字列の中の「a」と「a」に挟まれた「b」を「z」に置換する。

「abababa」という文字列ならば「azazaza」となるようにします。

まず思い付くのは次の方法。

moto="abababa";
saki=moto.replace(/aba/g,"aza");

「aba」となっているものを「aza」に置換します。
ところがこの場合、「azabaza」となってしまい、2番目の「b」が置換されません。
これは1番目の「b」が置換されるとき「aba」を対象にしてしまい、その次は「baba」に対して置換が実行されるからです。
最初の対象と次の対象が重なってしまうような場合、意図通りに置換されません。

このような場合に便利なのが「肯定先読み」という方法です。

(?=pattern)
pattern で指定した文字列が続く場合に一致と見なされます (肯定先読み)。一致した文字列は記憶されず、後で使用することはできません。たとえば、"Windows(?=95|98|NT|2000)" は "Windows 2000 " の "Windows" には一致しますが、"Windows 3.1" の "Windows " には一致しません。先読み処理では、読み進まれた文字は処理済みとは見なされません。一致の検出後、次の検索処理は先読みされた文字列の後からではなく、一致文字列のすぐ後から開始されます。

これを使うと次のようになります。

moto="abababa";
saki=moto.replace(/ab(?=a)/g,"az");

この場合、意図通り「azazaza」となります。
1番目の「b」が置換されるとき、対象は「ab」となり、その次は「ababa」に対して置換が実行されます。

[ 2010年9月14日 | カテゴリー: JavaScript | タグ: , ]

« | »

コメントを残す

メールアドレスが公開されることはありません。

送信してください。


タグ

カテゴリー

最近の投稿

最近のコメント

固定ページ

アーカイブ

stabucky

写真

メタ情報