Necesito dividir datos por punto. Y se me ha escapado el punto(.), que debo ignorar. También debería ignorar la barra invertida escapada también (\). Por ejemplo,
data1\\.d\\\\\.ata2\\\\.da\.ta3.data4Esta cadena debe dividirse para subcadenas como
data1\\ d\\\\\.ata2\\\\ da\.ta3 data4No puedo crear expresiones regulares para eso. ¿Sabes que es posible? Traté de usar lo siguiente:
(?<!\\((\\\\){2,}))\\. - not workingPuedo crear la siguiente expresión regular si la barra diagonal escapada se define solo una vez:
"((?<!\\\\)\\.)|((?=([^\\\\]*((\\\\\\\\)+[^\\\\]*)))\\.)"; Por ejemplo data1\\.d\.ata2.da\.ta3.data4 dividido correctamente:
data1\\ d\.ata2 da\.ta3 data4Pero no puedo detectar la definición de barra invertida ni siquiera un número de veces. ¿Puedes ayudarme por favor? ¡Gracias!
Puede extraer estas cadenas usando
(?s)(?:[^\\.]|\\.)+Vea la demostración de expresiones regulares . Detalles:
(?s) : habilite el indicador Pattern.DOTALL para que . podría coincidir a través de las líneas(?:[^\\.]|\\.)+ - una o más apariciones de cualquier carácter distinto de \ y . , o un \ seguido de cualquier carácter.Vea una demostración de Java :
String line = "data1\\\\.d\\.ata2.da\\.ta3.data4"; Pattern p = Pattern.compile("(?s)(?:[^\\\\.]|\\\\.)+"); Matcher m = p.matcher(line); List<String> res = new ArrayList<>(); while(m.find()) { res.add(m.group()); } System.out.println(res); // => [data1\\, d\.ata2, da\.ta3, data4]Puede usar esta expresión regular para obtener sus coincidencias:
(?=[^.])[^.\\]*(?:\\.[^.\\]*)*(?=\.|$)Demostración RegEx:
(?=[^.]) : Asegúrese de que haya un carácter que no sea un punto delante[^.\\]* : coincide con 0+ de cualquier carácter que no sea un . no un \(?:\\.[^.\\]*)* : un grupo que no es de captura que coincide con una barra invertida seguida de un carácter de escape y que debe ir seguido de 0 o más de cualquier carácter que no sea un . no un \ . Coincide con 0 o más de este grupo(?=\.|$) : Asegúrese de que tengamos un punto o un final de línea por delante