2012-08-04 38 views
19

我想用這個如何在不知道正則表達式匹配的情況下使用正則表達式提取子字符串(組)?

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

但它給當字符串不匹配的錯誤。如何在匹配是可選的情況下使用類似的構造?

編輯:要清楚,我需要的組(.*)

+1

那麼,當正則表達式不匹配時應該返回什麼,一個空字符串? – Bergi 2012-08-04 17:33:30

+1

我不在乎,只要程序不退出...另外一個如果「包含」或類似會很好,它只是要簡短和優雅。 – Ixx 2012-08-04 17:36:17

回答

33

您可以提取匹配組。

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

使用Option另一種方式:

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

正是我在找的,謝謝! – Ixx 2012-08-04 18:29:49

+0

我剛試過這個,val的名字不需要是大寫的(至少在windows的scala 2.9.2上) – 2012-08-04 18:51:46

+0

哦,對,只有沒有匹配組,它纔有必要。 – 2012-08-04 18:54:31

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) 
+0

但它返回的整場比賽,我想組(在我的情況下,後綴) – Ixx 2012-08-04 17:56:38

+0

我可以使用這種方式\t \t \t \t如果(!r.findFirstIn(線).isEmpty){ \t \t \t \t \t \t \t VAL R(後綴)=行 \t \t \t \t \t \t \t的println(後綴) \t \t \t \t}但是這看起來奇怪... – Ixx 2012-08-04 18:06:55

+0

ANS wer已更新 – viktortnk 2012-08-04 18:21:41

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

這樣做,你可以把它寫成一行代碼,而無需正則表達式分配給一箇中間值r優勢。

如果你想知道,組0是匹配的字符串,而組1等是捕獲組。