No Programming, No Life

新しいNPNLです。http://d.hatena.ne.jp/fumokmm/ から引っ越してきました。

Groovyの#stripMarginをもうちょっと便利にしてみた

はじめに

v1.7.3からString#stripMarginが追加されたので、先頭にパイプ('|')など*1を指定することで揃えることができるようになりました。

'''|aaa
   |bbb
   |ccc'''.stripMargin()

みたいな感じで書くと

aaa
bbb
ccc

といった感じになります。
まぁ、これはこれで便利なんですが、私としてはちょっと使い勝手が悪いなぁ…と思っていた次第です。

これができると何が嬉しいか

  1. 複数行文字列のうち、空行は無視して欲しい。*2
  2. 先頭は空白以外どんな文字があってもいいから指定した文字を先頭として扱いたい。
  3. あとは先頭文字としては自由に選びたいよね(デフォルトは'|'で良し)

てな感じで。

ソース (動作確認: Groovy Version: 1.7.5 JVM: 1.6.0_20)

stringStrip.groovy
// Stringを拡張
String.metaClass.strip = { first ->
  def reg = (first ?: '|').with{ [/^.*\${it}.*$/, /^.*\${it}/] }
  delegate.readLines()
    .grep(~reg[0])*.replaceFirst(reg[1], '')
    .join(System.properties['line.separator'])
}

// 検査用文字列
def str = '''

| >.a
| > .b
| >  .c

'''

// デフォルトの '|' でストリップしてみる
assert str.strip() == '''\
 >.a
 > .b
 >  .c'''

// お次は '>' でストリップ
assert str.strip('>') == '''\
.a
 .b
  .c'''

// 最後は '.' だ
assert str.strip('.') == '''\
a
b
c'''

おわりに

ということで、できました。

*1:引数によって変更可能です。

*2:そうしないと先頭に\を付けたりして工夫しないといけなくなったり。