String.split에 파이프 구분 기호가 필요한 이유는 무엇입니까?


140

파이프로 구분 된 값으로 각 줄이있는 파일을 구문 분석하려고합니다. 분할 방법으로 파이프 구분 기호를 이스케이프하지 않으면 올바르게 작동하지 않지만 다음과 같이 파이프를 이스케이프 한 후에는 올바르게 작동했습니다.

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
아래의 답변은 "이유"에 대한 답변이지만 FYI에 불과합니다. 리터럴 문자열과 일치시키려는 경우 Pattern.quote 도 볼 수 있습니다 . 그것은 소요 String와 정규식 반환 String(그것은 모두 당신을 위해 탈출을 담당, 즉) 입력을 일치합니다.
yshavit

–1Pattern.quote
redDevil

답변:


175

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


76

분할 할 해당 매개 변수의 구문 이 정규식이므로 '|' OR의 특별한 의미와 '\ |' 리터럴 '|'을 의미 문자열 "\\ |" 정규식을 의미합니다. '\ |' 이는 문자 '|'와 정확히 일치 함을 의미합니다.


1
이 설명에 감사드립니다. 나는 거의 항상 이중 탈출을 사용하는 것을 잊어 버립니다. 이제 그것이 왜 그런지 알았으므로 이제부터 기억하는 데 도움이 될 것입니다.
sufinawaz '11

문자열 행의 값에 파이프 문자가 있으면 어떻게됩니까? 이스케이프 된 파이프를 분리하지 않고 어떻게 분할 할 수 있을까요? \ | ?
AlexandreJ

@AlexandreJ를 어떻게 선을 분할 묻는 모습 같은 것을 : Some|Delimited|Text|With|An\|Embedded|Pipe|Char("Some", "Delimited", "Text", "With", "An\|Embedded", "Pipe", "Char")? split 함수는 이와 같이 이스케이프를 지원하지 않지만 그룹 뒤의 0 너비 네거티브 어설 션 룩과 (?<!\\)\|line.split("(?<!\\\\)\\|");
같이이

6

당신은 단순히 이것을 할 수 있습니다 :

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

올바른 수식 인 정규 표현식 "yourString.split ("\\ | ")"을 사용하려면 \를 이스케이프해야합니다.
mautrok
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.