Группа захвата 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 напрямую, и без отмены?
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