2008-12-17 7 views
1

Je regex simple,Erreur dans Regex for String

"\".*\"" 

pour moi le dit tout sélectionner entre "et", mais il attire aussi

"text") != -1 || file.indexOf(".exe" 

pour moi ses deux chaînes, pour regex son un. comment puis-je faire regex pour voir que ses deux chaînes?

P.S. J'utilise Java.

Répondre

12

C'est la forme non gourmande:

".*?" 

Le *? signifie: "match aussi peu que possible", alors que le seul moyen * Match "autant que possible". Ce dernier se poursuit essentiellement jusqu'à la fin de la chaîne, en redonnant les caractères un par un pour que le résultat final " puisse correspondre. C'est pourquoi vous obtenez tout entre la première et la dernière citation de votre chaîne.

// for the sake of completeness: Java would need this pattern string 
"\".*?\"" 
+4

En fait, « [^ » \ r \ n] * » est plus efficace et une meilleure pratique. Voir mon article sur l'utilisation du point paresseux avec parcimonie à http://www.regular-expressions.info/dot.html –

0

Trouver le moyen de spécifier le comportement non gourmand en regexp pour Java.

6

Les expressions régulières sont "gourmandes". Qu'est-ce que vous voulez faire est d'exclure des citations du milieu du match, comme

"\"[^\"]*\"" 
2

Au lieu d'utiliser .[^\"] afin que le regex ne peut pas correspondre "

0

Savez-vous combien de personnages seront, ou au moins un max? Si oui, vous pouvez utiliser \ ". {N,} \" où n est le maximum ou omettre le ',' si vous connaissez la longueur exacte.

2

Vous utilisez un quantificateur gourmand. Vous voulez plutôt un quantificateur réticent.

Le Javadocs pour modèle devrait aider: http://java.sun.com/j2se/1.5.0/docs/api/java/util/regex/Pattern.html

Sur cette page, vous trouverez ceci:

Greedy quantifiers 
X? X, once or not at all 
X* X, zero or more times 
X+ X, one or more times 
X{n} X, exactly n times 
X{n,} X, at least n times 
X{n,m} X, at least n but not more than m times 

Reluctant quantifiers 
X??  X, once or not at all 
X*?  X, zero or more times 
X+?  X, one or more times 
X{n}? X, exactly n times 
X{n,}? X, at least n times 
X{n,m}?  X, at least n but not more than m times 
1

Comme les autres réponses soulignent, le quantificateur () est gourmand et tente de faire correspondre autant de caractères que possible. Une solution de contournement est "\" [^ \ "] \" ", de sorte que non" correspond au milieu. Mais vous voulez vraiment un quantificateur réticent, qui essaie aussi peu de caractères que possible. Dans votre cas "\". *? \ "" Le quantificateur réticent est * ?.

En savoir plus sur ce here. Les différences entre les quantificateurs cupides, réticents et possessifs peuvent être particulièrement intéressantes ici.