Скажем, у меня есть этот код:
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
непосредственно, и без использования не применяются?
Вот пример того, как вы можете получить доступ к группе (1)
каждого совпадения:
val string = "one493two483three"
val pattern = """two(\d+)three""".r
pattern.findAllIn(string).matchData foreach {
m => println(m.group(1))
}
Это напечатает «483»
(, как показано на ideone.com ).
В зависимости от сложности шаблона вы также можете использовать поиск, чтобы только соответствовал нужной части. Это будет выглядеть примерно так:
val string = "one493two483three"
val pattern = """(?<=two)\d+(?=three)""".r
pattern.findAllIn(string).foreach(println)
Вышеупомянутое также печатает «483»
(, как показано на ideone.com ).
Вы хотите посмотреть на группу (1)
, в настоящее время вы смотрите на группу (0)
, которая представляет собой «всю согласованную строку».