¿Se puede usar una expresión regular de coincidencia de ancho cero en String split?

System.out.println( Arrays.deepToString( "abcghi".split("(?:)") ) ); 

Esto imprime [abc, def, ghi] , como si me hubiera dividido en "" . Quiero que imprima [abc, , ghi] . ¿Hay alguna forma de trabajar un poco de 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 se imprima [Hello!, Oh my!!, Good bye!!] . `.

Debes echar un vistazo a las construcciones de concordancia de ancho cero:

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

Puede usar \b (límite de palabras) como qué buscar ya que tiene ancho cero y lo usa como ancla para buscar < y > .

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

Salida:

 abc  ghi 

Ahora que no es una solución general. Probablemente necesites escribir un método de división personalizado para eso.

Su segundo ejemplo sugiere que en realidad no está split() que busca, sino un bucle de coincidencia de expresiones regulares. 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) + "]"); } 

Salida:

 [Hello!] [Oh my!!] [Good bye!!] 

Gracias a la información de Cine, creo que estas son las respuestas que estoy buscando:

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

Ahora, el segundo fue honestamente descubierto al experimentar con todos los diferentes cuantificadores. Ni el trabajo codicioso ni renuente, sino el posesivo.

Todavía no estoy seguro de por qué.

    Intereting Posts