如何在不知道正则表达式是否匹配的情况下使用正则表达式提取子字符串(组)?

时间:2012-08-04 17:31:46

标签: regex scala

我想用这个

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

但是当字符串不匹配时它会出错。如何使用匹配是可选的类似构造?

编辑:为了说清楚,我需要小组(.*)

3 个答案:

答案 0 :(得分:37)

您可以通过模式匹配提取匹配组。

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

使用Option的另一种方式:

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

答案 1 :(得分:27)

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

这样做的好处是,您可以将其编写为单行,而无需将正则表达式分配给中间值r

如果您想知道,第0组是匹配的字符串,而第1组等是捕获组。

答案 2 :(得分:2)

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)