2010-06-02 13 views
8

Je cherche une expression régulière pour faire correspondre les littéraux de chaîne dans le code source Java.Correspondance correcte d'un littéral de chaîne Java

Est-ce possible? Mon intention est de remplacer toutes les chaînes d'une autre chaîne par quelque chose d'autre. Utilisation:

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

Quelque chose comme ceci.

+0

Oui. Pouvez-vous fournir un extrait de code source pour mieux expliquer ce que vous recherchez? – Wangnick

Répondre

4

Ok. Donc, ce que vous voulez est de rechercher, dans une chaîne, une séquence de caractères commençant et se terminant par des guillemets?

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

Notez le modèle non gourmand .*?.

+1

Et si la chaîne dans la chaîne a aussi des guillemets? –

+0

Oui. Quoi alors. Comment savez-vous alors où cela se termine? Dans ce cas, vous devez faire en sorte que les guillemets dans la chaîne interne soient en quelque sorte échappés lors de la construction de la chaîne externe, gérez-la dans votre chaîne de remplacement, puis désactivez le résultat au fur et à mesure des besoins. Une manière possible d'échapper des citations est, par exemple, de les doubler. – Wangnick

+0

Si vous doublez des guillemets pour leur échapper, cependant, votre expression rationnelle devient délicate. Un meilleur est probablement de définir un autre caractère pour introduire l'échappement (par exemple, & like in html), puis d'échapper à toutes les occurrences de celui-là aussi. – Wangnick

1

Vous pouvez examiner différents générateurs d'analyseurs pour Java et leur expression régulière pour l'élément de grammaire StringLiteral.

Voici un example from ANTLR:

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

Je suppose que vous voulez éviter d'attraper '//" bonjour "' – aioobe

+0

J'ai toujours eu l'impression que la plupart des compilateurs Java pré-traitent les commentaires et seulement ensuite chercher tout le reste. Mais je peux me tromper à ce sujet. – Uri

+0

Mon problème avec cette réponse est que je ne suis pas très à l'aise avec les grammaires. –

-1

Vous ne dites pas quel est l'outil que vous utilisez pour faire vos conclusions (Perl sed éditeur de texte ctrl-F etc etc?). Mais une expression rationnelle générale serait:

\".*?\" 

Edit: ceci est une réponse rapide sale &, et ne traite pas des citations échappées, commentaires etc

+3

Qu'en est-il des guillemets échappés dans la chaîne? – Joe

+0

J'imagine que c'est Java regex, compte tenu de la balise Java. – corsiKa

+0

Ceci correspondra également aux citations dans les commentaires. Cela ne devrait pas avoir de faux négatifs, mais il aura certainement des faux positifs. –

-1

Utilisez ceci:

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

testé avec

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

Donne les éléments suivants 'B'

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

Essayez-le sur cette entrée: '" Double-citation est \ "ici -> \" <- ici \ "". – seh

+0

@seh, que considéreriez-vous comme une sortie correcte pour votre exemple? La question originale ne demande pas de devis - entre guillemets, guillemets non appariés, ou même guillemets multiples, d'ailleurs ... – tucuxi

+0

Je m'attendrais à ce que "Double-citation soit" Pepsi "', en lisant la question, parce que je prends un " chaîne littérale "pour signifier tout contenu valide dans la syntaxe du langage hôte pour définir une chaîne.Vous avez raison de dire que la question originale ne demandait pas la couverture des cas les plus difficiles, en mentionnant juste des chaînes dans les chaînes, mais je pense aussi Je me souviens que * Mastering Regular Expressions * de Jeffrey Friedl était légendaire pour avoir finalement posé l'ultime paire de chaînes de caractères entre guillemets, sans parler de son adresse e-mail RFC 822. C'est la référence – seh

2

cette regex peut gérer des guillemets doubles ainsi (REMARQUE: perl syntaxe étendue):

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

il définit que chaque «doit avoir une quantité bizarre d'échapper \ avant qu'il ne

peut-être il est possible d'embellir ce un peu, mais il fonctionne sous cette forme

+0

Ce modèle vient TRÈS proche de ce que je nécessaire! Cependant, que se passerait-il si la chaîne incorporée contenait, disons, une URL? Par exemple: "URL String: \" http: \/\/www.google.com \ ";", cette expression se casse alors en capturant uniquement ";". (Je me suis gratté la tête pendant des heures) – TekuConcept