我想用這個如何在不知道正則表達式匹配的情況下使用正則表達式提取子字符串(組)?
val r = """^myprefix:(.*)""".r
val r(suffix) = line
println(suffix)
但它給當字符串不匹配的錯誤。如何在匹配是可選的情況下使用類似的構造?
編輯:要清楚,我需要的組(.*)
我想用這個如何在不知道正則表達式匹配的情況下使用正則表達式提取子字符串(組)?
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 }
正是我在找的,謝謝! – Ixx 2012-08-04 18:29:49
我剛試過這個,val的名字不需要是大寫的(至少在windows的scala 2.9.2上) – 2012-08-04 18:51:46
哦,對,只有沒有匹配組,它纔有必要。 – 2012-08-04 18:54:31
嘗試
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)
"""^myprefix:(.*)""".r // Regex
.findFirstMatchIn(line) // Option[Match]
.map(_ group 1) // Option[String]
這樣做,你可以把它寫成一行代碼,而無需正則表達式分配給一箇中間值r
優勢。
如果你想知道,組0是匹配的字符串,而組1等是捕獲組。
那麼,當正則表達式不匹配時應該返回什麼,一個空字符串? – Bergi 2012-08-04 17:33:30
我不在乎,只要程序不退出...另外一個如果「包含」或類似會很好,它只是要簡短和優雅。 – Ixx 2012-08-04 17:36:17