Groovy(java?)の正規表現が便利(カネムーメモ: 正規表現、先読みと後読み より)
こういうのを見ると、無駄な正規表現処理をコーディングしていたんだなぁと感じる。
以下のような文字列から、数字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の正規表現は手順が面倒に感じてあまり使用してなかったのですが、
便利ですね。
教えていただいたサイト、参考にさせてもらいます。