2016-08-23 2 views
4

Мне нужно удалить префикс из String в Groovy, если он действительно в начале.Удалить префикс из строки в Groovy

Если префикс groovy:

  • для groovyVersion Я ожидаю Version
  • для groovy Я ожидаю, что пустая строка
  • для spock Я ожидаю spock

Сейчас я использую .minus(), но если сделаю

'library-groovy' - 'groovy' 

то в результате я получаю library- вместо library-groovy.

Что такое отличный способ достичь того, чего я хочу?

ответ

5

Я не знаю много о Groovy, но вот мое взятие на этом:

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

println(str) 
1

вы должны использовать регулярное выражение:

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

Вы могли бы это сделать, но я сомневаюсь, что он ловит все (как вы полагаете, у вас есть другие, которых вы не указали здесь)

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 
} 

Вы можете добавить это к th е метаклассом строки

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

затем сделать:

assert 'library-groovy'.stripGroovy() == 'library' 
+0

работает отлично, спасибо - однако я искал что-то простое и читаемое, без регулярных выражений –

+0

обернуть его в методе? Добавьте его в metaClass из String? –

+0

Конечно, обычно это был бы вариант, но мне он нужен в коротком и простом стилевом скрипте. Добавление метода будет длиннее самого скрипта :) –

1

Это чувствительно к регистру и не использует регулярное выражение:

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

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

Эта версия простой и простой, но соответствует требованиям и представляет собой постепенное изменение вашего оригинала:

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") 
Смежные вопросы