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 № 1Intenté 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