Получить индекс соответствия регулярному выражению в Scala - PullRequest
0 голосов
/ 01 декабря 2018

Как получить индекс соответствия регулярному выражению для строки в Scala?

val body = "This is a 'long string' with long string in it."
println(body.indexOf("long string")) // 11
println(body.indexOf("long string", 12)) // 37

// I'm looking for something like this:
"""\slong string""".r.findIndexIn(body) // Should give Some(36)
"""\slong string""".r.findIndexIn(body, 37) // Should give None

Есть ли какой-нибудь простой способ сделать это, не просматривая символы поиска совпадений для s"^${myRegex}"?Или мне нужно прибегнуть к использованию Java?

Ответы [ 3 ]

0 голосов
/ 01 декабря 2018

Опираясь на точный ответ Димы: вы можете получить список всех индексов совпадений за один проход через целевую строку.

"""\slong string""".r.findAllMatchIn(body).map(_.start).toList  //List(28)
""".long string""" .r.findAllMatchIn(body).map(_.start).toList  //List(10, 28)
"""Xlong string""" .r.findAllMatchIn(body).map(_.start).toList  //List()
0 голосов
/ 01 декабря 2018

И Дима, и jwvh помогли мне найти то, что мне нужно, особенно функции, предоставляемые классом Match.Для полноты и для будущих читателей, вот решения, которые я использовал для получения индекса результата из данного индекса , то есть функции, которая наблюдает следующее поведение:

findIndexFromPosition(body, """\slong string""", 0) // Some(36)
findIndexFromPosition(body, """\slong string""", 37) // None

Во-первых, используя Pattern и Matcher классы Java, согласно этому ответу :

def findIndexFromPosition(body: String, pattern: String, fromIndex: Int): Option[Int] = {
    val regex = Pattern.compile("\\slong string\\s").matcher(body)
    regex.find(fromIndex) match {
         case true => Some(regex.end)
         case false => None
    }
}

И, с помощью ответа jwvh, более скаламатический способ:

"""\slong string""".r.findAllMatchIn(body).map(_.start).find(_ > fromIndex)
0 голосов
/ 01 декабря 2018

Match класс содержит свойства, описывающие конкретное совпадение с регулярным выражением, включая позицию, с которой оно начинается.

Что-то вроде "foo".r.findFirstMatchIn(bar).map(_.start) должно делать то, что вы просите.

Но если вы действительно просто ищете подстроку, то bar.indexOf("foo") будет намного быстрее.

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