TL; DR
- se è necessario utilizzare la sintassi regex
replaceAll
o replaceFirst
,
- se si desidera che il
target/replacement
coppia di essere trattata come letterali utilizzano replace
(sostituisce anche tutti gli eventi del tuo obiettivo).
maggior parte delle persone sono confusi dalla sfortunata denominazione di metodi che sostituiscono in classe String, che sono:
replaceAll(String, String)
replaceFirst(String, String)
replace(CharSequence, CharSequence)
replace(char, char)
Metodo
Dal replaceAll
afferma esplicitamente che sostituisce tutti obiettivi posible, gente suppone che replace
metodo non non garantisce tale comportamento in quanto non contiene All
suffisso.
Ma questa ipotesi è errata.
differenza principale tra questi metodi è mostrato in questa tabella:
╔═════════════════════╦═══════════════════════════════════════════════════════════════════╗
║ ║ replaced targets ║
║ ╠════════════════════════════════════╦══════════════════════════════╣
║ ║ ALL found ║ ONLY FIRST found ║
╠══════╦══════════════╬════════════════════════════════════╬══════════════════════════════╣
║ ║ supported ║ replaceAll(String, String) ║ replaceFirst(String, String) ║
║regex ╠══════════════╬════════════════════════════════════╬══════════════════════════════╣
║syntax║ not ║ replace(CharSequence, CharSequence)║ \/ ║
║ ║ supported ║ replace(char, char) ║ /\ ║
╚══════╩══════════════╩════════════════════════════════════╩══════════════════════════════╝
Ora, se non avete bisogno di usare regex utilizzare il metodo della sintassi, che non si aspetta, ma si tratta di target
e replacement
come letterali.
Così, invece di replaceAll(regex, replacement)
uso replace(literal, replacement)
.
Come potete vedere ci sono due versioni di overload di replace
. Entrambi dovrebbero funzionare per te dal momento che non supportano la sintassi regex. La differenza principale tra loro è che:
replace(char target, char replacement)
crea semplicemente nuova stringa e riempirlo sia con carattere dalla stringa originale, o personaggio che ha deciso in sostituzione (a seconda se è stato pari a bersaglio carattere)
replace(CharSequence target, CharSequence replacement)
è essenzialmente equivalente replaceAll(Pattern.quote(target), Matcher.quoteReplacement(replacement.toString())
che significa che è uguale replaceAll
ma (che significa che usa internamente motore regex) ma sfugge metacaratteri regex utilizzati in target
e replacement
per noi automaticamente
usa 'replace' invece di' replaceAll'. – Pshemo
@Pshemo: si comportano in modo diverso? – Jim
Leggi la documentazione ... C'è 'replace (char, char)' e 'replace (String, String)' entrambi dovrebbero funzionare per te. – Pshemo