2012-08-04 12 views
19

私はこの正規表現が一致するかどうかを知らずに、正規表現を使用して部分文字列(グループ)を抽出するにはどうすればよいですか?

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

を使用したいしかし、それは文字列が一致しないエラーが発生します。マッチングがオプションの場合と同様の構文を使用するにはどうすればよいですか?

編集:あなたはパターンマッチングを経由してマッチグループを抽出することができ

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

正規表現が一致しない場合、空の文字列は何を返すべきですか? – Bergi

+1

プログラムが終了しない限り、私は気にしません...また、 "含まれている"または類似している場合、それはちょうど短くてエレガントでなければなりません。 – Ixx

答えて

33

:それを明確にするために、私は

r.findFirstIn(line) 

UPDを試みるグループに(.*)

+1

まさに私が探していた、ありがとう! – Ixx

+0

私はこれを試したところ、ヴァルの名前は大文字である必要はありません(少なくともWindowsではscala 2.9.2)。 –

+0

ああ、マッチグループがなければ必要です。 –

2

を必要としています。

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

Optionを使用して別の方法は:

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

しかし、(!r.findFirstIn(ライン).isEmpty){ \t \t \t \t \t場合、私はこのよう\t \t \t \tそれを使用することができ、それは全体の一致を返し、私は(私の場合は、接尾辞)グループをしたい – Ixx

+0

\t \tヴァル・R(接尾辞)=ライン \t \t \t \t \t \t \tのprintln(接尾辞) \t \t \t \t}が、それは奇妙な... – Ixx

+0

ANSに見えますwerが更新されました – viktortnk

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

これは中間値rに正規表現を割り当てるために必要とすることなく、ワンライナーとしてそれを書くことができるという利点があります。

あなたが疑問に思っている場合、グループ0は一致した文字列であり、グループ1などはキャプチャグループです。

関連する問題