Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    Problema con replace slash

    ciao!

    scusate la domanda forse stupida, ma io questa stringa composta da una parte statica ed una dinamica.
    quella statica è C:\inetpub\upload\, mentre quella dinamica è /AR/Allegati/PREVENTIVI/.

    in questa cartella devo caricare il file inviato dal client.
    quindi volevo sostituire gli slash con il file separator:
    codice:
    String str = "C:\\inetpub\\upload\\/AR/Allegati/PREVENTIVI/";
    System.out.println(str.replaceAll("/", File.separator));
    ma ottengo questo errore:
    codice:
    Exception in thread "main" java.lang.IllegalArgumentException: character to be escaped is missing
        at java.base/java.util.regex.Matcher.appendExpandedReplacement(Matcher.java:1019)
        at java.base/java.util.regex.Matcher.appendReplacement(Matcher.java:997)
        at java.base/java.util.regex.Matcher.replaceAll(Matcher.java:1181)
        at java.base/java.lang.String.replaceAll(String.java:2939)
        at org.example.Main.main(Main.java:8)
    che però non è ben capito.....

  2. #2
    Non conosco java ma a occhio ti direi che quando usi la barra dritta, viene interpretato come carattere di "escape" per altri caratteri speciali, quindi se usi /& vuol dire che & va interpretato come carattere e non come "and" (operatore logico).
    Ne deduco quindi che usando o tentando di usare "/" nella replace, venga interpretato come carattere di escape e ti avvisa che manca il carattere DA fare escape (manca "&" nell'esempio che ho portato io).
    Verifica la sintassi della funzione replaceAll e che tu stia usando correttamente gli escape

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da fermat Visualizza il messaggio
    codice:
    String str = "C:\\inetpub\\upload\\/AR/Allegati/PREVENTIVI/";
    System.out.println(str.replaceAll("/", File.separator));
    codice:
    Exception in thread "main" java.lang.IllegalArgumentException: character to be escaped is missing
    Il problema non è il primo argomento (cioè "/"). Lo slash / NON è un carattere "speciale" nelle regex. Il problema è il secondo argomento, perché sui Windows File.separator vale \ (come literal "\\") e il back-slash è un carattere speciale nelle regex e anche nell'argomento di sostituzione di replaceAll (vedi javadoc).

    Potresti usare il replace(CharSequence target, CharSequence replacement) che non usa le regex. Ma comunque avresti il problema del caso "\\/" che non risolverebbe.

    Una cosa più furba sarebbe fare un replace di tutte le occorrenze di una/più "\" e/o "/" per "aggiustarle" al corretto separator per il S.O.
    codice:
    String str2 = str.replaceAll("[\\\\/]+", Matcher.quoteReplacement(File.separator));

    Questo, tra l'altro, funzionerebbe pure sugli Unix-like nel senso che se avessi un path non ben messo tipo:

    "/tmp/\\prova\\hello.txt" (qui è scritto letterale, con \ raddoppiato)

    lo sistemerebbe comunque bene a "/tmp/prova/hello.txt".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Il problema non è il primo argomento (cioè "/"). Lo slash / NON è un carattere "speciale" nelle regex. Il problema è il secondo argomento, perché sui Windows File.separator vale \ (come literal "\\") e il back-slash è un carattere speciale nelle regex e anche nell'argomento di sostituzione di replaceAll (vedi javadoc).

    Potresti usare il replace(CharSequence target, CharSequence replacement) che non usa le regex. Ma comunque avresti il problema del caso "\\/" che non risolverebbe.

    Una cosa più furba sarebbe fare un replace di tutte le occorrenze di una/più "\" e/o "/" per "aggiustarle" al corretto separator per il S.O.
    codice:
    String str2 = str.replaceAll("[\\\\/]+", Matcher.quoteReplacement(File.separator));

    Questo, tra l'altro, funzionerebbe pure sugli Unix-like nel senso che se avessi un path non ben messo tipo:

    "/tmp/\\prova\\hello.txt" (qui è scritto letterale, con \ raddoppiato)

    lo sistemerebbe comunque bene a "/tmp/prova/hello.txt".
    in effetti non ci avevo pensato.
    grazie!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.