Подтвердить что ты не робот

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

Я хочу использовать этот

val r = """^myprefix:(.*)""".r
val r(suffix) = line
println(suffix)

Но это приводит к ошибке, когда строка не соответствует. Как использовать аналогичную конструкцию, где сопоставление является необязательным?

Изменить: Чтобы было ясно, мне нужна группа (.*)

4b9b3361

Ответ 1

Вы можете извлекать группы соответствия с помощью сопоставления с образцом.

val r = """^myprefix:(.*)""".r
line match {
  case r(group) => group
  case _ => ""
}

Другой способ: Option:

Option(line) collect { case r(group) => group }

Ответ 2

"""^myprefix:(.*)""".r        // Regex
  .findFirstMatchIn(line)     // Option[Match]
  .map(_ group 1)             // Option[String]

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

Если вам интересно, группа 0 - это согласованная строка, а группа 1 и т.д. - группы захвата.

Ответ 3

попробовать

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)