Группа захвата Scala с использованием регулярного выражения



скажем, у меня есть этот код:



val string = "one493two483three"
val pattern = """two(d+)three""".r
pattern.findAllIn(string).foreach(println)


Я ожидал findAllIn возврат только 483, но вместо этого, он вернулся two483three. Я знаю, что мог бы использовать unapply чтобы извлечь только эту часть, но я должен был бы иметь шаблон для всей строки, что-то вроде:



 val pattern = """one.*two(d+)three""".r
val pattern(aMatch) = string
println(aMatch) // prints 483


есть ли другой способ достичь этого, не используя классы от java.util напрямую, и без отмены?

543   4  

4 ответов:

вот пример, как вы можете получить доступ к group(1) каждого матча:

val string = "one493two483three"
val pattern = """two(\d+)three""".r
pattern.findAllIn(string).matchData foreach {
   m => println(m.group(1))
}

это выводит "483" (как видно на ideone.com).


опция lookaround

в зависимости от сложности шаблона, вы также можете использовать lookarounds to только матч той части, которую вы хотите. Это будет выглядеть примерно так:

val string = "one493two483three"
val pattern = """(?<=two)\d+(?=three)""".r
pattern.findAllIn(string).foreach(println)

выше также выводит "483" (как видно на ideone.com).

ссылки

val string = "one493two483three"
val pattern = """.*two(\d+)three.*""".r

string match {
  case pattern(a483) => println(a483) //matched group(1) assigned to variable a483
  case _ => // no match
}

вы хотите посмотреть group(1), вы сейчас смотрите на group(0), который является "всей согласованной строкой".

посмотреть это регулярное выражение, учебник.

def extractFileNameFromHttpFilePathExpression(expr: String) = {
//define regex
val regex = "http4.*\/(\w+.(xlsx|xls|zip))$".r
// findFirstMatchIn/findAllMatchIn returns Option[Match] and Match has methods to access capture groups.
regex.findFirstMatchIn(expr) match {
  case Some(i) => i.group(1)
  case None => "regex_error"
}
}
extractFileNameFromHttpFilePathExpression(
    "http4://testing.bbmkl.com/document/sth1234.zip")

Comments

    Ничего не найдено.