split (“|”)을 사용하여 파이프 기호로 Java 문자열 분할


195

Java 공식 문서에는 다음이 명시되어 있습니다.

"boo:and:foo"예를 들어, 문자열 은 이러한 표현식 Regex Result로 다음과 같은 결과를 생성합니다.

{ "boo", "and", "foo" }"

그것이 내가 작동하는 방식입니다. 그러나 내가 이것을 실행하면 :

public static void main(String[] args){
        String test = "A|B|C||D";

        String[] result = test.split("|");

        for(String s : result){
            System.out.println(">"+s+"<");
        }
    }

다음을 인쇄합니다.

><
>A<
>|<
>B<
>|<
>C<
>|<
>|<
>D<

내가 기대했던 것과는 거리가 멀다.

>A<
>B<
>C<
><
>D<

왜 이런 일이 발생합니까?


답변:


423

당신은 필요

test.split("\\|");

split정규 표현식을 사용에 정규식 | 나타내는 메타 문자 OR연산자. 를 사용하여 해당 문자를 이스케이프해야합니다 \( 문자열 리터럴의 메타 문자 "\\"이므로 문자열로 작성 \되므로 다른 문자 \가 이스케이프되어야합니다).

당신은 또한 사용할 수 있습니다

test.split(Pattern.quote("|"));

Pattern.quote나타내는 이스케이프 된 이스케이프 버전을 만들어 보자 |.


17
그것은, split()방법은 정규 표현식을 사용하고 정규 표현식의 |특수 문자입니다
Jigar Joshi

1
스택 오버플로에서 중재자로 두 번째로 선택합니다. 모두 제일 좋다.
Däñish Shärmà

33

적절한 이스케이프를 사용하십시오. string.split("\\|")

또는 Java 5 이상에서는 Pattern.quote()정확히이 목적으로 작성된 도우미 를 사용하십시오 .

string.split(Pattern.quote("|"))

임의의 입력 문자열과 함께 작동합니다. 사용자 입력을 인용 / 이스케이프해야 할 때 매우 유용합니다.


3
전환이 이루어질 때 확실하지 않지만 Java 8에서는을 사용 Pattern.quote()합니다.
RAnders00

4

이 코드를 사용하십시오 :

public static void main(String[] args) {
    String test = "A|B|C||D";

    String[] result = test.split("\\|");

    for (String s : result) {
        System.out.println(">" + s + "<");
    }
}

이 솔루션은 이미 받아 들여진 대답으로 지적되었습니다. 반복 할 필요가 없습니다.
Pshemo

3

아파치 라이브러리를 사용하여 다음을 수행 할 수도 있습니다.

StringUtils.split(test, "|");

1

을 사용할 수도 있습니다 .split("[|]").

(나는 대신 이것을 사용 .split("\\|")했지만 나에게는 효과가 없었다.)


두 버전 모두 제대로 작동합니다. 그렇지 않다면 문제가 다른 곳에있는 것입니다.
Pshemo

@Pshemo 그러나 이것은 흥미로운 맛을 더 해줍니다. 괄호 안에 넣으면 일부 예약 된 기호를 이스케이프 처리 할 필요가 없습니다.
Pax Vobiscum

0
test.split("\\|",999);

"boo ||| a"또는 "|| boo |"와 같은 예 에서는 한계 또는 최대 값을 지정하는 것이 정확 합니다. 또는 "|||"

그러나 test.split("\\|"); 동일한 예제에 대해 다른 길이의 문자열 배열을 반환합니다.

사용 참조 : 링크


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.