2010-03-14 11 views
2

Je travaille sur un modèle Regex pour les recherches qui devraient autoriser le signe '+' facultatif à inclure dans la recherche et le signe '-' à exclure de la recherche. Par exemple: + apple orange -peach devrait rechercher des pommes et des oranges et non des pêches. Aussi le modèle devrait permettre des phrases en guillemets mélangés avec des mots simples, par exemple: "pomme rouge" - "raisin noir" + orange - vous avez l'idée, même que la plupart des recherches sur Internet. Je suis en cours d'exécution 2 expressions régulières, d'abord de choisir tous les négatifs, ce qui est simple, car « - » est nécessaire:Motif Regex pour les recherches avec inclusion et exclusion

(?<=[\-]"?)((?<=")(?<exclude>[^"]+)|(?<exclude>[^\s,\+\-"]+)) 

Deuxièmement choisir positifs, et il est un peu plus complexe, car « + » est facultative:

((?<=[\+\s]")(?<include>[^\s"\+\-][^"]+))|(?<include>(?<![\-\w]"?)([\w][^,\s\-\+]+))(?<!") 

recherche positive est là où j'ai un problème, il fonctionne très bien quand je le lance dans RegexBuddy mais lorsque je tente en .Net le modèle Excité deuxième mot de critères négatifs, par exemple - "raisin noir" il prend le mot "raisin" même si elle se termine par une double citation.

Des suggestions?

+1

qui est vraiment pas un travail pour regex. Une simple recherche de chaîne ferait le travail et simplifierait tout. –

+0

Je suis d'accord ici. Vous voulez tout avoir de la chaîne de toute façon, optez simplement pour un analyseur basé sur l'état très, très simple. Vous vous évitez un mal de tête et c'est probablement encore plus rapide. –

+0

Je suis avec Max sur celui-ci, regex sont cool, mais ils ont leur place. Un analyseur de chaînes simple ou crawl serait beaucoup plus facile. – zellio

Répondre

1

Essayez cette expression:

[\+-]?(\w+|"[\w\s]+") 

commence par un + ou -, en option, puis correspond à un mot ou un mot avec des espaces entre guillemets.
Un autre conseil: pour expérimenter avec des expressions régulières, téléchargez un outil comme Expresso ou The Regulator.

Voici un exemple en utilisant des groupes nommés, de sorte que vous séparer signe et la valeur directement avec la regex:

static void Main(string[] args) { 
    string test = "\"red apple\" -\"black grape\" +orange"; 
    Regex r = new Regex("(?<sign>[\\+-]?)((?<value>\\w+)|\"(?<value>[\\w\\s]+)\")",RegexOptions.Compiled); 

    foreach (Match m in r.Matches(test)) { 
     Console.WriteLine(m.Groups["sign"]); 
     Console.WriteLine(m.Groups["value"]); 
    } 
} 
+0

Joli et simple, mais il y a une raison pour laquelle j'ai un look-ahead et un look-behind dans mon pattern, de sorte que je n'ai pas à chercher + - et des guillemets dans mon résultat. pour corriger mon modèle de recherche positive: ((? <= [\ + \ s] ") (? [^ \ s \" \ + \ -] [^ "] +)) (? = \") | (? [\ w] [^, \ s \ - \ +"] +) (?! [\ w "]) –

Questions connexes