2008/11/24

Groovy(java?)の正規表現が便利(カネムーメモ: 正規表現、先読みと後読み より)

こういうのを見ると、無駄な正規表現処理をコーディングしていたんだなぁと感じる。

カネムーメモ: 正規表現、先読みと後読み

以下のような文字列から、数字2桁の文字を置換する場合について。

あいうえお012かきく34けこなに56ぬね789の

いつも以下のようなソースを書いていました。

def text = "あいうえお012かきく34けこなに56ぬね789の"
text = text.replaceAll(/([^\d])(\d\d)([^\d])/, '$1$3')
println text

結果は「あいうえお012かきくけこなにぬね789の」。

どうしても前方の数値でない部分と、後方の数値でない部分が置換対象に入り込んでしまうので、しょうがなく置換後文字列を"$1$3"として処理していました。

どうやら以下のようにしたら、この問題が解決する模様。

def text = "あいうえお012かきく34けこなに56ぬね789の"
text = text.replaceAll(/(?<=[^\d])(\d\d)(?=[^\d])/, '')
println text

結果は同様に「あいうえお012かきくけこなにぬね789の」。

いや、知らなかった…Javaの正規表現なのかGroovy限定の正規表現なのかは分かりませんが、いずれにしても強力。勉強になったー。

2 件のコメント:

  1. 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
    とかが少しわかりやすいかもです

    返信削除
  2. >uehajさん
    javadocもう少し読んだほうがよかった…
    javaの正規表現は手順が面倒に感じてあまり使用してなかったのですが、
    便利ですね。

    教えていただいたサイト、参考にさせてもらいます。

    返信削除