2017-08-11 1 views
1

Ich möchte Split abcd\r\nabc\r\nppp zu (abcd\r\nabc, ppp) mit Regex "(.*)\r\n(.*)".r.Scala Regex kann nicht " r n" in einer geben Zeichenfolge, die mehrere enthält " r n"

aber die Regex scheitern wie folgt aus:

object Regex extends App { 
    val r = "(.*)\r\n(.*)".r 
    val str = "abcd\r\nabc\r\nppp" 

    str match { 
    case r(a,b) => 
     println((a,b)) 
    case _ => 
     println("fail - ") 
    } 
} 

Konsole Druck fail -.

Es funktioniert gut, wenn das Match Regex verwenden abcd\r\nppp, Code erneut:

object Regex extends App { 
    val r = "(.*)\r\n(.*)".r 
    val str = "abcd\r\nppp" 

    str match { 
    case r(a,b) => 
     println((a,b)) 
    case _ => 
     println("fail - ") 
    } 
} 

Außerdem will ich nicht \ r \ n zu anderem characters.It des Abfall berechnet Ressource ersetzen, da der Code verwendet wird, zur leistungsempfindlichen Bühne.

Dank

Antwort

1

Dot nicht \n standardmäßig überein (fragen Sie nicht, warum - es gibt keinen Grund, es funktioniert einfach nicht), so .* auf dem zweiten \n ausfällt. Sie können dies ändern, indem Sie einen DOTALL Flag für Ihre Regex angeben. Die durch Zugabe von (?s) zu Beginn des Musters fertig ist (nicht fragen, wie ?s für DOTALL stehen kam ... es gibt eine Menge Rätsel, wie diese in regex Welt):

val r = "(?s)(.*)\r\n(.*)".r 
val str = "abcd\r\nabc\r\nppp" 
str match { 
    case r(a,b) => println(a -> b) 
} 

Dieser druckt (abcd abc, ppp )

Wenn Sie bei der ersten \r\n eher als die letzte ? an die der ersten Gruppe hinzufügen teilen möchten:

val r = "(?s)(.*?)\r\n(.*)".r 

Dadurch wird der Platzhalter nicht gierig, sodass er der kürzest möglichen Zeichenfolge entspricht und nicht der längsten Zeichenfolge. Dies ist die Standardeinstellung.

+0

Sie sind wirklich gut :) –

Verwandte Themen