2012-12-05 15 views
9
val REGEX_OPEN_CURLY_BRACE = """\{""".r 
val REGEX_CLOSED_CURLY_BRACE = """\}""".r 
val REGEX_INLINE_DOUBLE_QUOTES = """\\\"""".r 
val REGEX_NEW_LINE = """\\\n""".r 

// Replacing { with '{' and } with '}' 
str = REGEX_OPEN_CURLY_BRACE.replaceAllIn(str, """'{'""") 
str = REGEX_CLOSED_CURLY_BRACE.replaceAllIn(str, """'}'""") 
// Escape \" with '\"' and \n with '\n' 
str = REGEX_INLINE_DOUBLE_QUOTES.replaceAllIn(str, """'\"'""") 
str = REGEX_NEW_LINE.replaceAllIn(str, """'\n'""") 

Czy istnieje prostszy sposób grupowania i zastępowania tych wszystkich {,},\",\n?scala regex group dopasowanie i zastąpić

Odpowiedz

12

Można użyć nawiasów, aby utworzyć grupę przechwytywania i $1 odnieść się do tej grupy przechwytywania w ciągu zastępującego:

"""hello { \" world \" } \n""".replaceAll("""([{}]|\\["n])""", "'$1'") 
// => java.lang.String = hello '{' '\"' world '\"' '}' '\n' 
+0

Nadal nie jestem pewien, co dokładnie chcesz zrobić z cytatami, ale myślę, że właśnie to teraz robisz ... – DaoWen

+0

I z mniejszymi tylnymi ukośnikami: "" "{" \ n} "" ". replaceAll ("" "([" {} \\ n]) "" "," '$ 1' ") – yakshaver

+0

@yakshaver - Twój przykład zastępuje' n' i '\' osobno, np. '" nie "' => '" 'n'o "'. Jeśli chodzi o ukośnik odwrotny przed cudzysłowem, to dlatego powiedziałem, że nie jestem pewien, co chce zrobić z cytatami. Myślę, że może on raczej szukać '\" 'zamiast samego' '' na własną rękę. – DaoWen

10

Można używać grup regex tak:

scala> """([abc])""".r.replaceAllIn("a b c d e", """'$1'""") 
res12: String = 'a' 'b' 'c' d e 

Wsporniki w regex pozwala dopasować jeden ze znaków między nimi. $1 zastępuje się tym, co znajduje się między nawiasami w wyrażeniach regularnych.

+0

Ponieważ jego sekwencje są wielokolorowe (czasami), myślę, że alternacja działałaby lepiej. – FrankieTheKneeMan

+1

'$ 0' jest faktycznie powiązane z całym pasującym ciągiem znaków. '$ 1' jest związane z pierwszą grupą dopasowania. W tym przypadku są one takie same, ponieważ pierwsza grupa dopasowania obejmuje cały wzorzec. – DaoWen

0

Rozważ to jest ciąg:

var actualString = "Hi { { { string in curly brace } } } now quoted string : \" this \" now next line \\\n second line text" 

Rozwiązanie:

var replacedString = Seq("\\{" -> "'{'", "\\}" -> "'}'", "\"" -> "'\"'", "\\\n" -> "'\\\n'").foldLeft(actualString) { _.replaceAll _ tupled (_) } 

scala> var actualString = "Hi { { { string in curly brace } } } now quoted string : \" this \" now next line \\\n second line text" 
actualString: String = 
Hi { { { string in curly brace } } } now quoted string : " this " now next line \ 
second line text 

scala>  var replacedString = Seq("\\{" -> "'{'", "\\}" -> "'}'", "\"" -> "'\"'", "\\\n" -> "'\\\n'").foldLeft(actualString) { _.replaceAll _ tupled (_) } 
replacedString: String = 
Hi '{' '{' '{' string in curly brace '}' '}' '}' now quoted string : '"' this '"' now next line \' 
' second line text 

Mam nadzieję, że to pomoże :)

+1

Z tym starym pytaniem pomaga wskazanie odpowiedzi, której nie zapewniają inne odpowiedzi. – jwvh

+0

Podczas gdy jesteś w tym. Napraw formatowanie :) –