La división Java está comiendo mis personajes

Tengo una cadena como esta String str = "la$le\\$li$lo" .

Quiero dividirlo para obtener la siguiente salida "la","le\\$li","lo" . El \ $ es un $ escapado, por lo que debe dejarse en la salida.

Pero cuando hago str.split("[^\\\\]\\$") y obtengo "l","le\\$l","lo" .

Por lo que obtengo, mi expresión regular es igualar un $ y un $ y luego eliminarlo. ¿Alguna idea de cómo recuperar mis personajes?

Gracias

Use aserciones de coincidencia de ancho cero:

  String str = "la$le\\$li$lo"; System.out.println(java.util.Arrays.toString( str.split("(? 

La expresión regular es esencialmente

 (? 

Utiliza un lookbehind negativo para afirmar que no hay un \ precedente.

Ver también

  • regular-expressions.info/Lookarounds

Más ejemplos de división en aserciones

División simple de oraciones, manteniendo los signos de puntuación:

  String str = "Really?Wow!This.Is.Awesome!"; System.out.println(java.util.Arrays.toString( str.split("(?<=[.!?])") )); // prints "[Really?, Wow!, This., Is., Awesome!]" 

Dividir una cadena larga en partes de longitud fija, usando \G

  String str = "012345678901234567890"; System.out.println(java.util.Arrays.toString( str.split("(?<=\\G.{4})") )); // prints "[0123, 4567, 8901, 2345, 6789, 0]" 

Usando un combo lookbehind / lookahead:

  String str = "HelloThereHowAreYou"; System.out.println(java.util.Arrays.toString( str.split("(?<=[az])(?=[AZ])") )); // prints "[Hello, There, How, Are, You]" 

Preguntas relacionadas

  • ¿Se puede usar una expresión regular de coincidencia de ancho cero en String split?
  • Backreferences en lookbehind
  • ¿Cómo convierto CamelCase en nombres legibles para humanos en Java?

La razón por la que $ y $ $ se eliminan es que la expresión regular [^\\]\$ coincide con cualquier carácter que no sea ‘\’ seguido de ‘$’. Necesita usar aserciones de ancho cero

Este es el mismo problema que las personas intentan encontrar q no seguido por usted.

Un primer corte en la expresión regular adecuada es /(? ( "(? en java)

 class Test { public static void main(String[] args) { String regexp = "(? 

Rendimientos:
[1a, 1e\$li, lo]

Puede intentar primero reemplazar “\ $” con otra cadena, como la encoding de URL para $ (“% 24”), y luego dividir:

 String splits[] = str.replace("\$","%24").split("[^\\\\]\\$"); for(String str : splits){ str = str.replace("%24","\$"); } 

De manera más general, si str se construye por algo como

 str = a + "$" + b + "$" + c 

Luego puede URLEncode a, byc antes de agregarlos juntos

 import java.net.URLEncoder.encode; ... str = encode(a) + "$" + encode(b) + "$" + encode(c) 
 import java.util.regex.*; public class Test { public static void main(String... args) { String str = "la$le\\$li$lo"; Pattern p = Pattern.compile("(.+?)([^\\\\]\\$)"); Matcher m = p.matcher(str); while (m.find()) { System.out.println(m.group(1)); System.out.println(m.group(2)); } } } 

da

 l a$ le\$l i$