Groovy: есть ли способ вернуть все вхождения строки в виде списка целочисленных смещений? - PullRequest
4 голосов
/ 28 января 2011

Учитывая строку, я знаю, что Groovy предоставляет удобные методы, такие как
String.findAll(String, Closure)

Находит все вхождения строки регулярного выражения в строке.Любые совпадения передаются в указанное закрытие.Ожидается, что замыкание будет полностью соответствовать первому параметру.Если есть какие-либо группы захвата, они будут помещены в последующие параметры.

Однако я ищу аналогичный метод, в котором замыкание получает либо объект Matcher, либо смещение int соответствия.Есть ли такой зверь?

Или, если нет: есть ли общий способ вернуть смещения всех совпадений для данной строки или образца в виде коллекции или массива целых / целых чисел?(Commons / Lang или Guava в порядке, но я бы предпочел простой Groovy).

Ответы [ 2 ]

5 голосов
/ 28 января 2011

Я не знаю ничего, что существует в настоящее время, но вы можете добавить метод в метакласс 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]/ )
}
3 голосов
/ 28 января 2011

Полагаю, что-то вроде

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 Console

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...