2011-10-03 49 views
3

如何查找大字符串中子字符串的所有出現的索引 - (所以基本上和「indexOf」函數的擴展)。有任何想法嗎?Groovy:子串的索引?

現狀:

def text = " --- --- bcd -- bcd ---" 
def sub = "bcd" 
text.indexOf(sub) 
// = 9 

我想是這樣的:

def text = " --- --- bcd -- bcd ---" 
def sub = "bcd" 
text.indexesOf(sub) 
// = [9,15] 

有這樣的功能?否則我應該如何實施? (在非平凡的方式)

+0

什麼是你的問題? 「我如何實施它?」或者「有這樣的事情嗎?」要麼 」...?」 –

+0

我改寫了這個問題,謝謝 – Yossale

回答

7

你可以寫一個新的除了String的metaClass像這樣:

String.metaClass.indexesOf = { match -> 
    def ret = [] 
    def idx = -1 
    while((idx = delegate.indexOf(match, idx + 1)) > -1) { 
    ret << idx 
    } 
    ret 
} 

def text = " --- --- bcd -- bcd ---" 
def sub = "bcd" 
text.indexesOf(sub) 

沒有什麼,我知道的是,在常規存在的當前,讓你這個免費的,雖然

+0

hehehe ..什麼'println'? ;-) _ *無辜的口哨聲* _ –

+0

我想你有和我以前一樣的無限循環;-)補充那些錯誤的錯誤 –

+0

哈哈哈,是的......我認爲'indexOf'中的'int'是獨家;-) –

4

這是一個比較簡單的方法:

String.metaClass.indexesOf = { arg -> 
    def result = [] 
    int index = delegate.indexOf(arg) 
    while (index != -1) { 
    result.add(index); 
    index = delegate.indexOf(arg, index+1); 
    } 
    return result; 
} 

注意,這找到重疊的情況下(即"fooo".indexesOf("oo")將返回[1, 2])。如果你不想要這個,用index+arg.length()代替index+1

+0

+1 hehe ...我當時~30秒太慢了;-) –