068:文字列の一部を特定の文字列で埋める

お題

「Password:」という文字列の後から行末までを「*」に変える

コード

def hidePassword(str){
    str.replaceAll(/(Password:)(.*)/) {all, s1, s2 ->
            s1 + '*'*s2.size()
    }
}
result = hidePassword("Password:あいうえおabcdeかきくけこfghij")
assert result == "Password:********************"

試行錯誤

$1と$2で""で括る
str.replaceAll(/(Password:)(.*)/ , "$1" + '*'*"$2".size())
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
D:\workspace\GroovySample\groovy_SandBox\Q068_文字列の一部を特定の文字列で埋める.groovy: 9: illegal string body character after dollar sign;
   solution: either escape a literal dollar sign "\$5" or bracket the value expression "${5}" @ line 9, column 34.
   str.replaceAll(/(Password:)(.*)/ , "$1" + '*'*"$2".size())
                                    ^

1 error

あれ?
なんでダメ?


$1と$2で''で括る
str.replaceAll(/(Password:)(.*)/ , '$1' + '*'*'$2'.size())
Caught: Assertion failed:

assert result == "Password:********************"
       |      |
       |      false
       Password:**

Assertion failed:

展開されず、size()が2となる

$1と$2で//で括る
  str.replaceAll(/(Password:)(.*)/, /$1/ + '*'* /$2/.size())
Caught: Assertion failed:

assert result == "Password:********************"
       |      |
       |      false
       Password:**

Assertion failed:

$2が展開されず、size()が2となる


クロージャーの数
groovy.lang.MissingMethodException: No signature of method: ConsoleScript1$_hidePassword_closure1.doCall() is applicable for argument types: (java.util.ArrayList) values: [[Password:あいうえおabcdeかきくけこfghij, Password:, ...]]

クロージャーに3つ指定しないとエラーになった



添削歓迎

ここ間違ってるよ
こうした方がGroovyらしくないか?
などなど
方法は、コメント、トラックバックはてブTwitter @orange_clover宛 で、お願いします。

実行環境




Groovyの詳細についてはJavadocと以下の書籍を参考にしている。




関谷 和愛、上原 潤二、須江 信洋、中野 靖治
価格: ¥ 3,360
価格は記載時点のものです。購入前にAmazonでご確認ください。

「プログラミングGROOVY」正誤表




問題自体は第2版のもの。
自分で考えるために他言語の例をGroovyで置き換えてる。
が、自分だけで書いてるとGroovyっぽくならいないのが玉にキズ。




青木 峰郎、後藤 裕蔵、高橋 征義、まつもと ゆきひろ

価格: ¥ 2,940
価格は記載時点のものです。購入前にAmazonでご確認ください。