2014-04-25 2 views
0

문자열에서 ${*} 표현을 추출하고 싶습니다.scala regex : 문자열에서 표현식 추출

val example = "Hello ${foo.bar} World" 

그러나 달러 기호와 중괄호는 표현식 구문의 일부이므로 탈출하려고했습니다.

val expr = "\\$\\{[a-zA-Z0-9\\w]*\\}".r 

하지만이 작동하지 않습니다와 println 인쇄 아무것도 :

for (ex <- expr.findAllMatchIn(example)) println(ex) 

누구나 무엇이 잘못 아이디어가있다? 더 우아한 정규식이 존재합니까? 당신이 foo.bar에서 .를 차지하지 않기 때문에이다

답변

2

, 대신 이렇게 :

최대의 유연성을 위해
\\$\\{[a-zA-Z0-9.\\w]*\\}    // allows for a . to also be in the string 

, 당신은 할 수 있습니다 :

\\$\\{[^}]*.

+0

"" "\"\ $ [{^}] *. "" ". r은 매우 잘 작동하며 여러 표현식을 추출 할 수도 있습니다. 'val example2 = "hello $ {foo.bar} world $ {bar.foo}"'. 그러므로 나는이 대답을 받아 들인다. :) – Themerius

+0

확실히 트리플 쿼트를 흔들어 라. 실수를 쉽게 발견 할 수 있습니다. –

+0

첫 번째 해결 방안의 단점을 더욱 강조해야합니다. "}"의 반복이없는 경우에만 작동합니다. 두 번째 방법은 유일하게 안전한 방법입니다. –

2

당신은 간단하게 사용할 수 있습니다 정규식을 사용하면 이중 인용 부호를 사용할 필요가 없으므로 이중 따옴표를 사용하지 않아도됩니다.

val example = "Hello ${foo.bar} World ${bar.foo}" 
               //> example : String = Hello ${foo.bar} World ${bar.foo} 

val expr = """\$\{.*?\}""".r     //> expr : scala.util.matching.Regex = \$\{.*?\} 

for (ex <- expr.findAllMatchIn(example)) println(ex) 
               //> ${foo.bar} 
               //| ${bar.foo} 
+0

감사합니다. ' "" "\"\ "\"\ "\"\ "\"\ r "은 매우 잘 작동하지만, 여러 표현식이 사용된다면 많이 일치합니다. 예를 들어'val example2 = "hello $ {foo.bar} world $ {bar.foo}"'와 같이 입력하십시오. – Themerius

+1

고정 - 비 탐욕적 수정 자 ('? ')를 추가했습니다 – DNA

+0

매우 잘 작동합니다. 고맙습니다! – Themerius