Я не знаю ничего, что существует в настоящее время, но вы можете добавить метод в метакласс String, если хотите ... Что-то вроде:
String.metaClass.allIndexOf { pat ->
def (ret, idx) = [ [], -2 ]
while( ( idx = delegate.indexOf( pat, idx + 1 ) ) >= 0 ) {
ret << idx
}
ret
}
Который может быть вызван:
"Finds all occurrences of a regular expression string".allIndexOf 's'
и возвращает (в данном случае)
[4, 20, 40, 41, 46]
Редактировать
На самом деле ... версия, которая может работать с параметрами регулярного выражения, будет:
String.metaClass.allIndexOf { pat ->
def ret = []
delegate.findAll pat, { s ->
def idx = -2
while( ( idx = delegate.indexOf( s, idx + 1 ) ) >= 0 ) {
ret << idx
}
}
ret
}
Который затем можно назвать как:
"Finds all occurrences of a regular expression string".allIndexOf( /a[lr]/ )
дать:
[6, 32]
Редактировать 2
И, наконец, этот код в качестве категории
class MyStringUtils {
static List allIndexOf( String str, pattern ) {
def ret = []
str.findAll pattern, { s ->
def idx = -2
while( ( idx = str.indexOf( s, idx + 1 ) ) >= 0 ) {
ret << idx
}
}
ret
}
}
use( MyStringUtils ) {
"Finds all occurrences of a regular expression string".allIndexOf( /a[lr]/ )
}