Groovy(Java?)の正規表現が便利(カネムーメモ: 正規表現、先読みと後読み より)
今まで無駄な正規表現処理をコーディングしていたことに気づきました。
Contents
学習前の正規表現
以下のような文字列から、数字2桁の文字を置換する場合について。
あいうえお012かきく34けこなに56ぬね789の
いつも以下のようなソースを書いていました。
def text = "あいうえお012かきく34けこなに56ぬね789の"
text = text.replaceAll(/([^d])(dd)([^d])/, '$1$3')
println text
結果は あいうえお012かきくけこなにぬね789の
。
どうしても前方の数値でない部分と、後方の数値でない部分が置換対象に入り込んでしまうので、しょうがなく置換後文字列を $1$3
として処理していました。
学習後の正規表現
以下のようにしたら、この問題が解決できるようになりました。
def text = "あいうえお012かきく34けこなに56ぬね789の"
text = text.replaceAll(/(?<=[^d])(dd)(?=[^d])/, '')
println text
結果は同様に あいうえお 012 かきくけこなにぬね 789 の
となりました。
ひとこと
いや、知りませんでした。
Java の正規表現なのか Groovy 限定の正規表現なのかは分かりませんが、いずれにしても強力。勉強になりました。
ディスカッション
コメント一覧
Javaの正規表現ですね。
http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/util/regex/Pattern.html
などをどうぞ。とかいっても「(?<=X) X、幅ゼロの肯定後読み」では意味がわからないですよね。
http://homepage1.nifty.com/algafield/jjd.html
http://homepage1.nifty.com/algafield/jjd/jjdPattern.html
とかが少しわかりやすいかもです
>uehajさん
javadocもう少し読んだほうがよかった…
javaの正規表現は手順が面倒に感じてあまり使用してなかったのですが、
便利ですね。
教えていただいたサイト、参考にさせてもらいます。