Java Groovy:有没有一种方法可以将所有出现的字符串作为整数偏移量列表返回?

Java Groovy:有没有一种方法可以将所有出现的字符串作为整数偏移量列表返回?,java,string,groovy,Java,String,Groovy,给定一个字符串,我知道Groovy提供了方便的方法,如 查找正则表达式的所有匹配项 字符串中的表达式字符串。任何 将匹配项传递给指定的 关闭。预计关闭时间将延长 在第一场比赛中全胜 参数如果有任何捕获 组,它们将被放置在 后续参数 但是,我正在寻找一种类似的方法,其中闭包接收匹配器对象或匹配的int偏移量。有这样的野兽吗 或者,如果没有:是否有一种通用的方法可以将给定字符串或模式的所有匹配项的偏移量作为整数/整数的集合或数组返回?(Commons/Lang或Guava都可以,但我更喜欢纯Gro

给定一个字符串,我知道Groovy提供了方便的方法,如

查找正则表达式的所有匹配项 字符串中的表达式字符串。任何 将匹配项传递给指定的 关闭。预计关闭时间将延长 在第一场比赛中全胜 参数如果有任何捕获 组,它们将被放置在 后续参数

但是,我正在寻找一种类似的方法,其中闭包接收匹配器对象或匹配的int偏移量。有这样的野兽吗

或者,如果没有:是否有一种通用的方法可以将给定字符串或模式的所有匹配项的偏移量作为整数/整数的集合或数组返回?(Commons/Lang或Guava都可以,但我更喜欢纯Groovy)。

我猜是这样的

def str = " a long string with some regexpable text in"
def lastIndex = 0
def indexes = str.findAll(~/e/) { match ->
    lastIndex = str.indexOf(match, lastIndex+1)
    return lastIndex
}
将完美地完成这项工作,如本例所示

[23, 26, 28, 34, 37]

在Groovy控制台中,我不知道当前存在什么,但是如果需要,可以将该方法添加到字符串的元类中。。。比如:

String.metaClass.allIndexOf { pat ->
  def (ret, idx) = [ [], -2 ]
  while( ( idx = delegate.indexOf( pat, idx + 1 ) ) >= 0 ) {
    ret << idx
  }
  ret
}
和返回(在本例中)

编辑

实际上,可以使用正则表达式参数的版本是:

String.metaClass.allIndexOf { pat ->
  def ret = []
  delegate.findAll pat, { s ->
    def idx = -2
    while( ( idx = delegate.indexOf( s, idx + 1 ) ) >= 0 ) {
      ret << idx
    }
  }
  ret
}
给予:

[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]/ )
}
类MyStringUtils{
静态列表allIndexOf(字符串str,模式){
def ret=[]
str.findAll模式,{s->
def idx=-2
而((idx=str.indexOf(s,idx+1))>=0){

ret很好的工作解决方案,谢谢(+1),但我正在寻找更简洁的解决方案。谢谢(+1)。假设我有一个测试类,它在每个方法中都需要这个功能。我应该把它放在哪里?在一个静态初始值设定项中?一旦调用,这将对在该点之后创建的
String
的每个实例都可用,所以是的,早期只调用一次的地方将是一个好地方。为了避免污染String的元类,y你也可以把它作为一个类别来做,但是你需要这样做:
use(MyCategory){“a string”。allIndexOf's}
wow,我以前从来没有听说过类别,!@sean它们是一个非常好的方法,可以添加功能,而不会太严重地污染元类。我已经将代码作为一个类别添加到答案中:-)
"Finds all occurrences of a regular expression string".allIndexOf( /a[lr]/ )
[6, 32]
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]/ )
}