/ / Expresión regular, cómo dividir con | y evitando dividir cuando es antes - java, regex

Expresión regular, cómo dividir con | y evitando dividir cuando es antes - java, regex

Tengo el siguiente texto

 aaa|bbbb|cccc|dddd|eeee|ffff

y quiero dividir por | y excluyendo cuando | es precedido por y obtiene

aaa

bbbb

cccc

dddd | eeee

ffff

Gracias.

ps: intenté usar algún generador de expresiones regulares (por ejemplo http://txt2re.com/ ) pero, francamente, regexp es cualquier cosa menos amigable.

actualización: finalmente me rindo. Regexp no es rápido (hice un punto de referencia), tampoco está claro (en comparación con una función que todos pueden seguir), luego lo omito y ahora estoy usando código real.

Respuestas

2 para la respuesta № 1

Intenté agregar esto como un comentario a la respuesta de los párpados, pero no sé cómo formatearlo allí ...

De todos modos, la respuesta de falta de párpados me parece correcta:

    String str = "aaa|bbbb|cccc|dddd\|eeee|ffff";
String[] tokens = str.split("(?<!\\)\|");
System.out.println(Arrays.toString(tokens));

que imprime:

[aaa, bbbb, cccc, dddd|eeee, ffff]

2 para la respuesta № 2

Esto debería hacerlo:

(?<!\\)\|

Si desea permitir barras inclinadas invertidas con barra invertida, puede usar:

(?<!(?<!\\)\\)\|

Entonces, dada la cuerda aaa|bbbb|cccc|dddd|eeee\|ffff, la división sería:


aaa
bbbb
cccc
dddd|eeee*
ffff

* O dddd|eeee\ si no está eliminando las barras de escape por alguna razón.

Editar: no está familiarizado con el sabor de la expresión regular de Java, se agregaron escapes por comentario de frenético de trinquete.


1 para la respuesta № 3

No lo usas split() para esto. (Podría hacerlo si Java admitiera la repetición indefinida dentro de las afirmaciones de mirar atrás. Pero no es así).

Mejor recoge todos los partidos entre |s:

List<String> matchList = new ArrayList<String>();
Pattern regex = Pattern.compile("(?:\\.|[^\\|])*");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
matchList.add(regexMatcher.group());
}

Esto se divide correctamente aaa|bbbb\|cccc|dddd|eeee|ffff\|ggg\\|hhhh dentro

aaa
bbbb\
cccc
dddd|eeee
ffff\|ggg\\
hhhh