2012-07-01 4 views
19

다음은 내 REPL 출력입니다. string.split이 왜 작동하지 않는지 잘 모르겠습니다.scala string.split가 작동하지 않습니다.

val s = "Pedro|groceries|apple|1.42" 
s: java.lang.String = Pedro|groceries|apple|1.42 

scala> s.split("|") 
res27: Array[java.lang.String] = Array("", P, e, d, r, o, |, g, r, o, c, e, r, i, e, s, |, a, p, p, l, e, |, 1, ., 4, 2) 

답변

56

따옴표를 사용하는 경우 정규식 분할을 요청합니다. |은 "or"문자이므로 정규식이 아무 것도 아니거나 전혀 일치하지 않습니다. 그래서 모든 것이 나뉘어져 있습니다.

split('|') 또는 split("""\|""")을 사용하는 경우 원하는 것을 얻어야합니다.

+0

좋습니다. 스칼라에서 ''와 ''의 차이점은 무엇입니까? – riship89

+2

'' "stuff" ""'는 리터럴 문자열을 인용합니다. ''stuff "'는 이스케이프 문자를 해석합니다. 역 슬래시는 자바 문자열 _and_ regexes의 이스케이프 문자 _both_이므로 이스케이프 문자를 이스케이프 처리하여 정규 표현식으로 가져와야합니다 :' "\\ |"'. _very_를 혼란스럽게하므로 삼중 따옴표를 사용하고 리터럴 문자열을 사용하는 것이 좋습니다. –

+0

및 ... ""somestring "" "과 같은 'somestring'입니까? – riship89

3

Split은 첫 번째 인수로 정규식을 취하므로 호출이 "빈 문자열 또는 빈 문자열"로 해석됩니다. 예상되는 동작을 얻으려면 파이프 문자 "\\ |"를 이스케이프 처리해야합니다.

5

|OR 작업 논리 연산자로 사용되는 특수 정규식 문자이다. java.lang.String#split(String regex); 정규 표현식에서 걸리므로

, 당신은 아무도은 본질적으로 모든 단일 문자 사이 "을 의미 전체가 정규 표현식 분할에 대한 또 다른 명물 "없음 또는 없음 ", 함께 문자열을 분할하고 ".

원하는 것을 얻으려면 정규 표현식 패턴을 올바르게 이스케이프 처리해야합니다. 패턴을 벗어나려면 \ 문자를 앞에두고 \ 문자는 특수 문자 String (예 : \t\r)으로 작성해야하므로 실제로는 두 번 이스케이프 처리해야 s.split("\\|")이됩니다.

전체 Java 정규 표현식 구문은 java.util.regex.Pattern javadoc을 참조하십시오.

관련 문제