正規表現で「肯定先読み」を使う
JavaScriptを使って、次の作業をしたいと思います。
文字列の中の「a」と「a」に挟まれた「b」を「z」に置換する。
「abababa」という文字列ならば「azazaza」となるようにします。
まず思い付くのは次の方法。
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 " には一致しません。先読み処理では、読み進まれた文字は処理済みとは見なされません。一致の検出後、次の検索処理は先読みされた文字列の後からではなく、一致文字列のすぐ後から開始されます。
これを使うと次のようになります。
saki=moto.replace(/ab(?=a)/g,"az");
この場合、意図通り「azazaza」となります。
1番目の「b」が置換されるとき、対象は「ab」となり、その次は「ababa」に対して置換が実行されます。
[ 2010年9月14日 | カテゴリー: JavaScript | タグ: JavaScript , 置換 ]
« 27歳で亡くなったミュージシャン | コードを整形する「Online javascript beautifier」 »
コメントを残す