2012-08-04 20 views
19

Chcę skorzystać z tejJak wyodrębnić podciąg (grupę) za pomocą wyrażeń regularnych bez znajomości dopasowania wyrażenia regularnego?

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

Ale daje błąd gdy łańcuch nie pasuje. Jak korzystać z podobnej konstrukcji, gdy dopasowanie jest opcjonalne?

Edit: Żeby było jasne, muszę grupę (.*)

+1

Co należy zwrócić, gdy wyrażenie regularne nie pasuje, pusty ciąg znaków? – Bergi

+1

Nie obchodzi mnie, o ile program nie wychodzi ... Również jeśli "zawiera" lub coś podobnego byłoby w porządku, po prostu musi być krótkie i eleganckie. – Ixx

Odpowiedz

33

Można wyodrębnić grupy meczu poprzez dopasowywanie wzorców.

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

Innym sposobem korzystania Option:

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

Dokładnie to, czego szukałem, dzięki! – Ixx

+0

Po prostu próbowałem tego, a nazwa val nie musi być wielka (przynajmniej na scala 2.9.2 na windowsie) –

+0

Dobra, tylko bez grupy matchowej byłoby to konieczne. –

2

spróbować

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

ale zwraca cały mecz i chcę grupę (w moim przypadku, przyrostek) – Ixx

+0

mogę go używać w ten sposób \t \t \t \t if (! R.findFirstIn (linia) .isEmpty) { \t \t \t \t \t \t \t val r (przyrostek) = linia \t \t \t \t \t \t \t println (przyrostek) \t \t \t \t} ale wygląda dziwne ... – Ixx

+0

ans wer został zaktualizowany – viktortnk

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

Ma to tę zaletę, że można napisać go jako jedną wkładką bez konieczności przypisania regex do wartości pośredniej r.

Jeśli zastanawiasz się, grupa 0 to dopasowany ciąg, podczas gdy grupa 1 itd. To grupy przechwytujące.

Powiązane problemy