2013-04-09 1 views
3

원활하게 처리 할 수 ​​있습니까?스칼라, 문자열 변수가 문자열로 처리되지 않았습니다.

scala> val p = "$" 
scala> "hello, I have 65 dollars".replaceFirst("dollars", p) 

현재 결과

java.lang.StringIndexOutOfBoundsException: String index out of range: 1 
.... 

스칼라 2.10의 예상 된 결과이다

hello, I have 65 $ 

문제 심볼 $ 저장 변수 p 함께, I 문자열로하지 처리해야 정규식.

참고 :내가 (예 : 모든 비 문자 기호를 대체) 수정할 수있는 페이지 변수 (전용 표준 기능, 예를 들면로 .toString)

주 2 일 : 주어진 예를 들어 장난감 오히려입니다 -예. 좀 더 일반적인 해결책을 고맙게 생각합니다. 나는. 변수 p은 모든 유형의 내용 (기호, 숫자, 텍스트 등)을 포함 할 수 있으므로 "\\ $"대신 "$"를 사용하지 마십시오.

(이와 비슷한 문제가 개선되었습니다. scala string, raw string)

+0

는 관련이 http://stackoverflow.com/questions/12115187/replace-with –

+0

@ OM-NOM-NOM 그래, 나는 이미 그것을 읽고 (이건 그냥. Pattern를 호출),하지만 교체가 .. . 오류가 발생하지 않도록하기 위해 변수 p가 포함 할 수 있거나 포함 할 수없는 것을 추측하지 않고 작업을 수행 할 수있는 방법이 존재하지 않습니까? – xhudik

+0

@Jesper 이것은 여러 가지 다른 질문입니다 note2 참조 – xhudik

답변

2

사용 Regex.quote 패턴의 경우 quoteReplacement을 대체 문자열로 사용합니다.

scala> import util.matching._ 
import util.matching._ 

scala> "hello, I have 65 dollars".replaceFirst("dollars", Regex quoteReplacement p) 
res7: String = hello, I have 65 $ 

scala> "dollars".r replaceFirstIn ("hello, I have 65 dollars", Regex quoteReplacement p) 
res8: String = hello, I have 65 $ 

scala> "hello, I have 65 dollars".replaceAllLiterally("dollars", p) // quotes both 
res9: String = hello, I have 65 $ 
+0

매우 직관적이지는 않지만 작동합니다 - 감사합니다! – xhudik

2

Java uses it in its implementation of regular expressions as a group reference이므로 달러 기호 리터럴을 이스케이프 처리해야합니다.

당신은 당신이 P 변수에 리터럴 문자열을 수정할 수 없습니다, 그래서 당신은 this처럼 달러 기호 및 기타 특수 문자를 대체에 의존 할 필요가 주목 :

Pattern.quote(p); 
+0

거기에 다른 방법으로 그것을 할 수 있습니까?그렇지 않은 경우 어떤 기호를 교체해야합니까? 나는 $와 \ - 다른 것을 알고 있습니까? 변수 p는 모든 문자 (문자, 기호, 숫자, ..)를 포함 할 수 있으므로 모든 "특수 문자"를 제거해야합니다. – xhudik

+0

오, 나는 당신의 질문을 잘못 이해합니다. 나는 네가 단지 달러 기호에 관심이 있다고 생각했다. 내 대답이 업데이트되었습니다. – Hanno

+0

간단한 예를 넣고 싶었습니다. 아마 편집하겠습니다. 어쨌든 답변 해 주셔서 감사합니다 – xhudik

1

을 문제는 replaceFirst라고이다() 그래서 정규 표현식을 사용

"65 dollars".replaceFirst("dollars","$0") // compiles 
"65 dollars".replaceFirst("dollars","$") // throws "StringIndexOutOfBoundsException" 

, 만약

val dollars = "$" 

당신은 $ 기호를 탈출 할 수

"65 dollars".replaceFirst("dollars", if(dollars == "$") "\\$" else dollars) 

또는 사용 문자열 보간,

s"65 $dollars" 

또는 오래된 학교 문자열 조작을 이동

val t = "65 dollars".split("dollars"); if(t.size>1) t.mkString(dollars) else t(0) + dollars 

또는지도

,

val ff = "dollars" 
val r1 = "$" 
"65 dollars, 3 dollars, 50 dollars".split(ff).zipWithIndex.map{case (t,0) => t+r1; case (t,_) => t+ff}.mkString 
+0

pls 내 note2를 참조하십시오, 나는 몇 가지 일반적인 해결책을 찾고 있어요, 단지 $. 즉, 가능한 모든 이스케이프 및 특수 문자 ($, \, &, @ 및 그 외 무엇을 알고 있는지)를 바꾸지 않고 regexp 대신 string처럼 변수 p를 처리한다는 의미입니다. – xhudik

+0

그래서 여러 솔루션을 제공했습니다. 문자열 보간을 시도 할 수 있습니다. 나는 $ 기호가 정규식에서 "잡았다"예상치 못한 오류가 될 수 있기 때문에 귀하의 질문을 upvoted. –

+0

키이스에게 감사하지만 여전히 예상되는 대답은 아닙니다. 예 : 변수 달러에 "\"가 있으면 오류가 발생합니다. 예, $ 문제를 해결했지만 다른 기호와 유사한 문제가있을 수 있습니다. "\". 당신이 말한대로 replace First는 arugument를 regexp로 취합니다 -이 "feature"를 regexp 대신 문자열을 받아들이도록 변경할 수 있습니까? 또는 작업을 수행 할 다른 "replaceFirst"기능을 사용합니까? – xhudik

관련 문제