Ответ 1
Вы можете извлекать группы соответствия с помощью сопоставления с образцом.
val r = """^myprefix:(.*)""".r
line match {
case r(group) => group
case _ => ""
}
Другой способ: Option
:
Option(line) collect { case r(group) => group }
Я хочу использовать этот
val r = """^myprefix:(.*)""".r
val r(suffix) = line
println(suffix)
Но это приводит к ошибке, когда строка не соответствует. Как использовать аналогичную конструкцию, где сопоставление является необязательным?
Изменить: Чтобы было ясно, мне нужна группа (.*)
Вы можете извлекать группы соответствия с помощью сопоставления с образцом.
val r = """^myprefix:(.*)""".r
line match {
case r(group) => group
case _ => ""
}
Другой способ: Option
:
Option(line) collect { case r(group) => group }
"""^myprefix:(.*)""".r // Regex
.findFirstMatchIn(line) // Option[Match]
.map(_ group 1) // Option[String]
Это имеет то преимущество, что вы можете записать его как однострочный, не требуя присвоения регулярному выражению промежуточному значению r
.
Если вам интересно, группа 0 - это согласованная строка, а группа 1 и т.д. - группы захвата.
попробовать
r.findFirstIn(line)
UPD:
scala> val rgx = """^myprefix:(.*)""".r
rgx: scala.util.matching.Regex = ^myprefix:(.*)
scala> val line = "myprefix:value"
line: java.lang.String = myprefix:value
scala> for (rgx(group) <- rgx.findFirstIn(line)) yield group
res0: Option[String] = Some(value)