2012-03-21 3 views
140

각 줄에 파이프 구분 값이있는 파일을 구문 분석하려고합니다. split 메소드에서 파이프 분리 문자를 이스케이프하지 않았을 때 올바르게 작동하지 않았지만 파이프를 다음과 같이 이스케이프 처리 한 후에 올바르게 작동했습니다. 왜 String.split에 파이프 구분 기호가 필요합니까?

private ArrayList<String> parseLine(String line) { 
    ArrayList<String> list = new ArrayList<String>(); 
    String[] list_str = line.split("\\|"); // note the escape "\\" here 
    System.out.println(list_str.length); 
    System.out.println(line); 
    for(String s:list_str) { 
     list.add(s); 
     System.out.print(s+ "|"); 
    } 
    return list; 
} 

누군가는 파이프 문자가 split() 방법에 대한 탈출해야하는 이유를 설명시겠습니까?

+13

답은 아래의 대답은 "왜"하지만 당신은 리터럴 문자열과 일치하려는 경우 단지 참고로, 당신은 또한 ([Pattern.quote]에서 볼 수있다 http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#quote(java.lang.String)). 그것은'String'을 취하고 입력과 일치하는 정규 표현식'String'을 반환합니다 (즉, 모든 이스케이프를 처리합니다). – yshavit

+0

+1 'Pattern.quote' – redDevil

답변

175

String.split 정규식 인수가 필요합니다. 이스케이프 처리되지 않은 |은 "빈 문자열 또는 빈 문자열"을 의미하는 정규식으로 구문 분석됩니다. 이는 의미가 아닙니다.

76

split에 대한 해당 구문의 구문이 정규 표현식이므로 '|' OR이라는 특별한 의미를 가지고 있고 '\ |' 리터럴 '|'을 의미합니다. 그래서 문자열 "\\ |" 정규식 '\ |'을 의미합니다. 이는 정확히 '|'문자와 일치한다는 것을 의미합니다.

+1

이 설명에 감사드립니다. 나는 거의 항상 이중 탈출구를 사용하는 것을 잊어 버린다. 이제는 그것이 왜 그런지 알았으니 이제부터 기억할 수있을 것입니다. – sufinawaz

+0

String 행의 값에 파이프 문자가 있으면 어떻게됩니까? 이스케이프 된 파이프를 분할하지 않고 어떻게 분할 할 수 있습니까? ? – AlexandreJ

+0

@AlexandreJ'Some |, Delimited | Text | With | \ | Embedded | Pipe | Char'와 같이'("Some", "Delimited", "Text", "With" ","An \ | Embedded ","Pipe ","Char ")'? 스플릿 함수는 이와 같이 이스케이프를 지원하지 않지만,이 경우에는 사용할 수있는 정규 표현식을 만들 수 있습니다. 예를 들어, 너비가 0 인 네거티브 어설 션 룩어백 그룹처럼 사용할 수 있습니다.'(? dlamblin

6

당신은 단순히이 작업을 수행 할 수 있습니다

String[] arrayString = yourString.split("\\|"); 
+0

당신은 정규 표현식을 사용하기 위해 \를 이스케이프 처리해야합니다. "yourString.split ("\\ | ")"올바른 공식입니다. – mautrok

관련 문제