2013-07-09 5 views
6

Ci sono già diverse domande su MessagingFormat in generale, ma non ho ancora trovato nulla che risponda alla mia domanda. Sono consapevole che le virgolette singole romperanno il modello. Se usi MessageFormat o Log4j qualcosa come "does not" può rompere possibili segnaposti.Escaping virgolette singole per Java MessageFormat

Vedere Within a String, a pair of single quotes can be used to quote any arbitrary characters except single quotes. For example, pattern string "'{0}'" represents string "{0}", not a FormatElement. A single quote itself must be represented by doubled single quotes '' throughout a String.

semplice esempio:

@Test 
public void test() { 
    String pattern = "{0} doesn't show values ({1}, {2}, {3}, {4})"; 
    final Object[] args = { "Testpattern", 100, 200, 300, 400 }; 
    System.out.println(MessageFormat.format(pattern, args)); 
    pattern = pattern.replaceAll("(?<!')'(?!')", "''"); 
    System.out.println("Replaced singlequotes: " + MessageFormat.format(pattern, args)); 
} 

uscita:

Testpattern doesnt show values ({1}, {2}, {3}, {4}) 
Replaced singlequotes: Testpattern doesn't show values (100, 200, 300, 400) 

Quindi, se sostituisco tutte le virgolette singole con un regular expression, funzionerà. Ho appena creato l'espressione regolare cercando di sostituire solo "single singlequotes" usando l'espressione regolare lookahead/lookbehind.

espressione regolare sostituire esempi:

doesn't -> doesn''t 
    doesn''t -> doesn''t 
    doesn'''t -> doesn'''t 

Mi chiedo solo, se qualsiasi utilità apache-commons (o qualsiasi altra libreria) esiste, che si occuperà delle "escapeSingleQuotes" Per me, invece di fornire la mia espressione regolare ...?

risposta

3

Dal momento che non ho trovato un altro API che fornirebbe la Singlequote sfuggito (' -> '') rimarrò con m y espressione regolare.

8

mi ha aiutato a fare qualcosa di simile:

`doesn''t` 
+0

Sì, questo funziona se si conoscono citazioni singole e MessageFormat. Ma fornire una struttura basata su sviluppatori che scrivono sempre due citazioni non è una buona scelta. – proko

+0

La raccomandazione da ICU consiste nell'utilizzare l'apostrofo ASCII ('U + 0027) solo per l'escape di caratteri di sintassi e utilizzare la citazione singola piuttosto (' U + 2019) per gli apostrofi effettivi e le virgolette singole in un modello di messaggio. –

2

per tutti che ha Android problemi nel string.xml, utilizzare \ '\' invece di sola offerta.

3

La raccomandazione da ICU consiste nell'utilizzare l'apostrofo ASCII ('U + 0027) solo per l'escape di caratteri di sintassi e utilizzare la virgoletta piuttosto semplice (' U + 2019) per gli apostrofi effettivi e le virgolette singole in un modello di messaggio.

+0

Sì, sarebbe davvero d'aiuto. Il nostro framework fornisce un logger e dovrebbe essere a conoscenza delle virgolette singole e del formato dei messaggi non interrotto.Dal momento che altri potrebbero usare il logger, non possiamo controllare se ogni sviluppatore utilizza le virgolette appropriate. – proko