2010-06-02 18 views
8

Sto cercando un'espressione regolare che corrisponda ai valori letterali stringa nel codice sorgente Java.Corrisponde correttamente a una stringa Java letterale

È possibile?

private String Foo = "A potato"; 
private String Bar = "A \"car\""; 

Il mio intento è sostituire tutte le stringhe all'interno di un'altra stringa con qualcos'altro. Utilizzo:

String A = "I went to the store to buy a \"coke\""; 
String B = A.replaceAll(REGEX,"Pepsi"); 

Qualcosa come questo.

+0

Sì. Potete fornire uno snippet di codice sorgente per spiegare meglio cosa state cercando? – Wangnick

risposta

4

Ok. Quindi quello che vuoi è cercare, all'interno di una stringa, una sequenza di caratteri che inizia e finisce con virgolette doppie?

String bar = "A \"car\""; 
    Pattern string = Pattern.compile("\".*?\""); 
    Matcher matcher = string.matcher(bar); 
    String result = matcher.replaceAll("\"bicycle\""); 

Nota il modello non avido .*?.

+1

E se la stringa all'interno della stringa contiene anche virgolette? –

+0

Sì. Cosa poi. Come fai a sapere dove finisce? In questo caso, devi fare in modo che le virgolette nella stringa interna vengano in qualche modo sfuggite durante la costruzione della stringa esterna, trattale con questa nella stringa di sostituzione e quindi annota nuovamente il risultato come e quando richiesto. Un possibile modo di sfuggire alle virgolette è, per esempio, raddoppiarle. – Wangnick

+0

Se si raddoppiano le virgolette per sfuggirle, tuttavia, la regexp diventa complicata. Uno migliore è probabilmente quello di definire un altro carattere per introdurre la fuga (ad es., E come in html), e quindi di sfuggire anche a tutte le occorrenze di quell'altro. – Wangnick

1

È possibile esaminare diversi generatori di parser per Java e la loro espressione regolare per l'elemento grammaticale StringLiteral.

Ecco un example from ANTLR:

StringLiteral 
    : '"' (EscapeSequence | ~('\\'|'"'))* '"' 
    ; 
+0

Immagino che vorrai evitare di cogliere '//" ciao "' – aioobe

+0

Ho sempre avuto l'impressione che la maggior parte dei compilatori Java pre-elabori i commenti e solo poi cerca tutto il resto. Ma potrei sbagliarmi su questo. – Uri

+0

Il mio problema con questa risposta è che non sono molto comodo con le grammatiche. –

-1

Tu non dici quello strumento che si sta utilizzando per fare il vostro ritrovamento (perl sed editor di testo Ctrl-F etc etc?). Ma una regex generale sarebbe:

\".*?\" 

Edit: questo un breve & risposta sporca, e non far fronte con le citazioni sfuggiti, commenti ecc

+3

Che dire di virgolette con escape nella stringa? – Joe

+0

Immagino che sia un'espressione regolare di Java, considerando il tag Java. – corsiKa

+0

Questo corrisponderà anche alle citazioni nei commenti. Questo non dovrebbe avere falsi negativi, ma sicuramente avrà dei falsi positivi. –

-1

Utilizzare questa:

String REGEX = "\"[^\"]*\""; 

Testato con

String A = "I went to the store to buy a \"coke\" and a box of \"kleenex\""; 
String B = A.replaceAll(REGEX,"Pepsi"); 

ottengono i seguenti 'B'

I went to the store to buy a Pepsi and a box of Pepsi 
+0

Provalo con questo input: '" Double-quote is \ "here -> \" <- here \ "" '. – seh

+0

@seh, quale considereresti un output corretto per il tuo esempio? La domanda originale non richiede quotazioni -con le virgolette, le virgolette non abbinate o anche le stringhe a più quotature, per quello ... – tucuxi

+0

Mi aspetterei che "Double-quote is" Pepsi "', dalla mia lettura della domanda, perché prendo un " stringa letterale "per indicare qualsiasi contenuto valido nella sintassi della lingua host per definire una stringa. Hai ragione che la domanda originale non chiedeva la copertura dei casi più difficili, menzionando solo stringhe all'interno di stringhe, ma penso anche questo è ciò che rende il problema interessante. Ricordo che il Mastering Regular Expressions * di Jeffrey Friedl era leggendario per aver finalmente definito l'ultimo matcher a doppia quotazione, per non menzionare il suo RFC 822 matcher per gli indirizzi email.Questo è il punto di riferimento – seh

2

questa regex in grado di gestire le virgolette così (NOTA: perl sintassi estesa):

" 
[^\\"]* 
(?: 
    (?:\\\\)* 
    (?: 
     \\ 
     " 
     [^\\"]* 
    )? 
)* 
" 

si definisce che ogni "deve avere una quantità dispari di fuggire \ prima che

forse è possibile abbellire questo un po ', ma funziona in questa forma

+0

vicino a ciò che io necessario! Tuttavia, cosa succede se la stringa incorporata dovesse, per esempio, contenere un URL? Ad esempio: "Stringa URL: \" http: \/\/www.google.com \ ";", questa espressione si interrompe e acquisisce solo ";". (Mi sono grattato la testa per ore) – TekuConcept

Problemi correlati