2010-01-05 7 views
4

multiligne chaîne Test:match toutes de chaîne entre guillemets qui ne contient pas une sous-chaîne

dkdkdkdk dkdkdkdk dkdkdkd dkdkdkd "hello" dkdkdkdkdk dkdkdk "goodbye.hello" dkdkdkd kdkdkd kdkdkdk "hello.goodbye.hello" dddd "test" ssss "http:x-y.f/z/z" "" "." 
"http:/dkdkd/dkdkdk/dkdkdkdkdkdk.g" 

Je veux correspondre à chaque chaîne entre guillemets qui contient « hello »

Cela correspond à chaque chaîne entre guillemets

\"(.+?)\" 

Ceci correspond à chaque chaîne entre guillemets qui contient bonjour

\"(.*?)hello(.*?)\" 

Mais, ne correspond pas à chaque chaîne entre guillemets qui ne contient pas bonjour

\"(.*?)(?!hello)(.*?)\" 

Merci pour toute aide!

Répondre

3

Ma réponse initiale est nécessaire d'appliquer la préanalyse négative chaque fois correspond au point, comme suit:

\"((?!hello).)*?\" 

Cependant, il y a un problème avec cette expression régulière dans les cibles qui contiennent plus d'une chaîne entre guillemets - - l'espace entre la citation de fermeture d'une chaîne et la chaîne d'ouverture d'une autre citation est également une "chaîne entre guillemets" pour cette expression.

Ma suggestion consiste donc à extraire toutes les chaînes de votre cible en utilisant un modèle simple "[^"]*", puis d'évaluer chaque correspondance pour le ou les mots que vous voulez interdire.

+0

Une meilleure utilisation ' "[^"] * "'au lieu de'". *" '. – Gumbo

+0

@Gumbo Je ne vois pas quelle différence cela fait –

+1

? Vandersluis @ Daniel – Gumbo

0

Essayez cette

\"((?!hello).)*?\" 
+1

C'est ce que j'ai trouvé au début, mais j'ai supprimé ma réponse parce qu'elle a un problème: dans la chaîne de test, elle ne correspondra pas à "" hello "', mais à la place ça va correspondre '" dkdkdkdkdk dkdkdk "' –

+0

@Vandersluis, même ici –

+0

Mieux vaut utiliser "" [^ "] *" 'au lieu de' ". *?" '. – Gumbo