2013-07-03 5 views
1

Je suis un débutant en utilisant regex, j'ai des chaînes comme String1= "DELIVERY 'text1' 'text2'" et string2="DELIVERY 'text1'", je veux extraire "text1". J'ai essayé ce modèleextrait une chaîne avec regex

Pattern p = Pattern.compile("^DELIVERY\\s'(.*)'"); 
Matcher m2 = p.matcher(string); 

       if (m2.find()) { 

        System.out.println(m2.group(1)); 

        } 

le résultat était: text1' 'text2 pour la 1ère chaîne et text1 pour la deuxième j'ai essayé cela aussi

Pattern p = Pattern.compile("^DELIVERY\\s'(.*)'\\s'(.*)'"); 
Matcher m2 = p.matcher(string); 

        if (m2.find()) { 

         System.out.println(m2.group(1)); 

         } 

il retourne un résultat que pour String1

Répondre

5

Votre premier tentative était presque juste. Il suffit de remplacer:

.* 

Avec:

.*? 

Cela rend l'opérateur "non gourmand", il va "engloutir" aussi peu que possible apparié texte.

+0

merci ça marche pour moi :) – Mikou

+0

@Mikou si cela résout votre problème, vous pouvez accepter la solution: – Grimmy

0

si vous ne voulez avoir 'text1', essayez cette regex:

"DELIVERY '([^']*)" 

ou sans groupement:

"(?<=DELIVERY ')[^']*" 
+0

Alors que cela fonctionne dans cet exemple, je ne recommanderais pas d'utiliser un espace littéral comme ça. Quelque chose comme "\ s +" est presque toujours meilleur, car il couvre des possibilités comme des espaces multiples ou des onglets. –

+0

merci cela fonctionne aussi;) – Mikou

+0

@ TomLord vous avez raison. Je viens de copier la chaîne. Je pense que ce n'est pas le point de la question. de toute façon, vous avez raison. – Kent

1

Votre regex .* est "gourmand", et consomme le plus d'information possible encore toujours correspondre, donc il va consommer tout de la première à la dernière citation.

utiliser à la place une relictant la version en ajoutant ?, c.-à-.*? au costume aussi peu que possible correspondre encore toujours, qui ne sera pas sauter Iver un devis.

Combiner ce changement avec quelques java Kung Fu et vous pouvez le faire en une seule ligne:

String quoted = str.replaceAll(".*DELIVERY\\s'(.*?)'.*", "$1");