Pregunta

System.out.println(
    Arrays.deepToString(
        "abc<def>ghi".split("(?:<)|(?:>)")
    )
);

Esto imprime [abc, def, ghi], como si me hubiera dividido "<|>". Quiero que imprima [abc, <def>, ghi]. ¿Hay alguna forma de trabajar una magia regex para lograr lo que quiero aquí?


Quizás un ejemplo más simple:

System.out.println(
    Arrays.deepToString(
        "Hello! Oh my!! Good bye!!".split("(?:!+)")
    )
);

Esto imprime [Hello, Oh my, Good bye]. Quiero que imprima [Hello!, Oh my!!, Good bye!!]. `.

¿Fue útil?

Solución 3

Gracias a la información de Cine, yo pensar Estas son las respuestas que estoy buscando:

System.out.println(
    Arrays.deepToString(
        "abc<def>ghi<x><x>".split("(?=<)|(?<=>)")
    )
); // [abc, <def>, ghi, <x>, <x>]


System.out.println(
    Arrays.deepToString(
        "Hello! Oh my!! Good bye!! IT WORKS!!!".split("(?<=!++)")
    )
); // [Hello!,  Oh my!!,  Good bye!!,  IT WORKS!!!]

Ahora, el segundo fue descubierto honestamente experimentando con todos los diferentes cuantificadores. Ni un trabajo codicioso ni reacio, pero posesivo lo hace.

Todavía no estoy seguro de por qué.

Otros consejos

Debe echar un vistazo a las construcciones coincidentes de ancho cero:

(?=X)   X, via zero-width positive lookahead
(?!X)   X, via zero-width negative lookahead
(?<=X)  X, via zero-width positive lookbehind
(?<!X)  X, via zero-width negative lookbehind

Puedes usar \b (límite de palabras) como qué buscar, ya que es anchado cero y úselo como el ancla para buscar < y >.

String s = "abc<def>ghi";
String[] bits = s.split("(?<=>)\\b|\\b(?=<)");
for (String bit : bits) {
  System.out.println(bit);
}

Producción:

abc
<def>
ghi

Ahora esa no es una solución general. Probablemente necesite escribir un método dividido personalizado para eso.

Tu segundo ejemplo sugiere que en realidad no es split() Estás después pero un bucle de juego de regex. Por ejemplo:

String s = "Hello! Oh my!! Good bye!!";
Pattern p = Pattern.compile("(.*?!+)\\s*");
Matcher m = p.matcher(s);
while (m.find()) {
  System.out.println("[" + m.group(1) + "]");
}

Producción:

[Hello!]
[Oh my!!]
[Good bye!!]
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top