Dividir una cadena de Java por el símbolo de la tubería utilizando split ("|")


195

La documentación oficial de Java establece:

La cadena "boo:and:foo", por ejemplo, produce los siguientes resultados con estas expresiones Resultado de expresión regular:

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

Y así es como lo necesito para funcionar. Sin embargo, si ejecuto esto:

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

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

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

imprime:

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

Lo cual está lejos de lo que esperaría:

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

¿Por qué está pasando esto?


Respuestas:


423

Necesitas

test.split("\\|");

splitusa expresiones regulares y en regex | es un metacarácter que representa al ORoperador. Necesitas escapar de ese personaje usando \(escrito en String "\\"ya \que también es un metacarácter en literales de String y requiere otro \para escapar de él).

También puedes usar

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

y deja Pattern.quotecrear la versión escapada de la representación de expresiones regulares |.


17
Es, el split()método toma expresiones regulares y |es un personaje especial para el ex reg.
Jigar Joshi

1
Eres mi segunda opción como moderador en el desbordamiento de pila. Todo lo mejor.
Däñish Shärmà

33

Use el escape apropiado: string.split("\\|")

O, en Java 5+, use el ayudante Pattern.quote()que se ha creado exactamente para este propósito:

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

que funciona con cadenas de entrada arbitrarias. Muy útil cuando necesita citar / escapar la entrada del usuario.


3
No se sabe cuándo se realizó la transición, pero en Java 8, se usaría Pattern.quote().
RAnders00

4

Usa este código:

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

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

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

Esta solución ya está señalada por la respuesta aceptada. No es necesario repetirlo.
Pshemo

3

También puede usar la biblioteca apache y hacer esto:

StringUtils.split(test, "|");

1

También puedes usar .split("[|]").

(Usé esto en lugar de .split("\\|"), lo que no funcionó para mí).


Ambas versiones deberían funcionar bien. Si no lo hace, sugiere que el problema está en otro lugar.
Pshemo

@Pshemo Sin embargo, esto agrega un sabor interesante, que algunos símbolos reservados no tienen que escaparse si se colocan entre corchetes.
Pax Vobiscum

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

Especificar un límite o un máximo será exacto para ejemplos como: "boo ||| a" o "|| boo |" o "|||"

Pero test.split("\\|");devolverá diferentes series de cadenas de longitud para los mismos ejemplos.

usar referencia: enlace


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.