web-dev-qa-db-ja.com

Groovyの文字列から接頭辞を削除する

文字列を開始する場合は、Groovyで文字列からプレフィックスを削除する必要があります(それ以外の場合はアクションはありません)。

接頭辞がgroovyの場合:

  • groovyVersionの場合はVersionを期待します
  • groovyには空の文字列が必要です
  • spockの場合はspockを期待します

今は.minus()を使用していますが、使用すると

'library-groovy' - 'groovy'

その結果、私はlibrary- の代わりに library-groovy

私が望むものを達成するためのグルーヴィーな方法は何ですか?

13
Michal Kordas

私はGroovyについてはあまり知りませんが、これは私の考えです。

def reg = ~/^groovy/   //Match 'groovy' if it is at the beginning of the String
String str = 'library-groovy' - reg

println(str)
21
ccheneson

このバージョンは単純でシンプルですが、要件を満たし、元のバージョンへの段階的な変更です。

def trimGroovy = { 
    it.startsWith('groovy') ? it - 'groovy' : it
}

assert "Version" == trimGroovy("groovyVersion")
assert "" == trimGroovy("groovy")
assert "spock" == trimGroovy("spock")
assert "library-groovy" == trimGroovy("library-groovy")
4
Michael Easter

これは大文字と小文字が区別され、正規表現を使用しません。

​def prefix = 'Groovy';
def string = 'Groovy1234';
def result = '';

if (string.startsWith(prefix)) {
    result = string.substring(prefix.size())
    print result
}
3
Fels

あなたはこれを行うことができますが、私はそれがあなたの要件のすべてをキャッチすることを疑います(あなたがここで指定していない他のものを持っていると思うので)

def tests = [
    [input:'groovyVersion',  expected:'Version'],
    [input:'groovy',         expected:''],
    [input:'spock',          expected:'spock'],
    [input:'library-groovy', expected:'library'],
    [input:'a-groovy-b',     expected:'ab'],
    [input:'groovy-library', expected:'library']
]

tests.each {
    assert it.input.replaceAll(/\W?groovy\W?/, '') == it.expected
}

これを文字列のmetaClassに追加できます

String.metaClass.stripGroovy = { -> delegate.replaceAll(/\W?groovy\W?/, '') }

次に行います:

assert 'library-groovy'.stripGroovy() == 'library'
2
tim_yates

あなたは正規表現を使うべきです:

assert 'Version  spock' == 'groovyVersion groovy spock'.replaceAll( /\bgroovy/, '' )
1
injecteer