2009-10-23 6 views
1

Je veux correspondre et modifier une partie d'une chaîne, si les conditions suivantes sont remplies:Comment faire AND des conditions dans une expression régulière?

Je souhaite recueillir des informations au sujet d'un projet, comme la durée du projet, le client, les technologies utilisées, etc ..

Alors, je vouloir sélectionner une chaîne commençant par le mot «projet» ou une chaîne peut commencer par d'autres mots comme «détails du projet» ou «détails du projet» ou «projet n ° 1».

RegEx. devrait d'abord regarder le mot «projet» et il devrait sélectionner la chaîne seulement lorsque peu ou tous les mots suivants sont trouvés après le mot «projet».

  1) client 
    2) duration 
    3) environment 
    4) technologies 
    5) role 

Je veux sélectionner une chaîne si elle correspond à au moins 2 des mots ci-dessus. Les mots peuvent apparaître dans n'importe quel ordre et si la chaîne contient ANY deux ou trois de ces mots, la chaîne doit être sélectionnée.

J'ai un exemple de texte ci-dessous.


Détails des projets: * Projet n ° 1: cryptogramme â € « La création de valeur client (septembre 2007 â € « jusqu'à maintenant) Temps Warner Cable est le leader des médias et du divertissement du monde, le temps Warner Cable (TWC) fait coaxial carquois.

Client: Time Warner Cable, US. ETL

outil: Informatica 7.1.4

Base de données: Oracle 9i.

Rôle: Développeur ETL/Chef d'équipe.

O/S: UNIX. Responsabilités: Plan de test créé et livre de cas de test. Membres de l'équipe évalués par des pairs> Mappings. Mappages documentés. Diriger l'équipe de développement. Envoi de rapports sur site. Bug> fixation pour les défauts, les données et les performances liées.

Détails du projet # 2: MYER â € « Les ventes Système d'analyse (novembre 2005 â € « jusqu'à présent) Coles Myer est l'un des plus grands détaillants de l'Australie avec plus de 2000> magasins dans toute l'Australie,

clients : Coles Myer Commerce de détail, Australie. Outil ETL: Base de données Informatica 7.1.3: Oracle 8i. Rôle: Développeur ETL. O/S: UNIX. Responsabilités: Extraction, Transformation et chargement des données en utilisant Informatica. Comprendre le système source complet
Créé et exécuté des sessions et Workflows. Créé Trier les fichiers en utilisant Application Syncsort. *

Est-ce que quelqu'un sait comment y parvenir en utilisant des expressions régulières? Tous les indices ou expressions régulières sont les bienvenus!

Merci beaucoup!

+0

pouvez-vous répéter? Quels mots devraient correspondre dans votre texte d'exemple? – Jaskirat

+0

@Svante mots à Mached dans le texte de l'échantillon sont: Projet n ° 1: cryptogramme â € « Création de valeur client (septembre 2007 â € « jusqu'à maintenant) Time Warner Warner Cable (TWC) fait carquois coaxial. Client: Time Warner Cable, États-Unis. Outil ETL: Base de données Informatica 7.1.4: Oracle 9i. Détails du projet # 2: MYER - Système d'analyse des ventes (Nov 2005 - jusqu'à maintenant) Coles Myer est l'un des plus grands détaillants d'Australie avec plus de 2 000 magasins à travers l'Australie, Client: Coles Myer Retail, Australie. Outil ETL: Base de données Informatica 7.1.3: Oracle 8i. Rôle: Je souhaite sélectionner des informations relatives au projet. – Shekhar

+0

@Svante J'ai découpé du texte à partir d'un exemple de texte en raison des restrictions sur les caractères numériques autorisées dans les commentaires. – Shekhar

Répondre

1

Je voudrais le décomposer en quelques regex plus simples pour obtenir ces résultats. Le premier ne sélectionnerait que le morceau de texte entre les projets: (? = Numéro de projet). * (? < = Numéro de projet)
Avec la correspondance que cela produit, je voudrais exécuter une regex séparée pour demander si elle contient l'un de ces mots: client | durée | environnement | technologies | rôle Si ce match revient avec un nombre de plus de 2 correspondances distinctes, vous savez sélectionner la chaîne d'origine!

Edit:

string originalText; 
MatchCollection projectDescriptions = Regex.Matches(originalText, "(?=Project #).(?:(?!Project #).)*", RegexOptions.IgnoreCase | RegexOptions.Singleline); 
Foreach(Match projectDescription in projectDescriptions) 
{ 
    MatchCollection keyWordMatches = Regex.Matches(projectDescription.value, "client | duration | environment | technologies | role ", RegexOptions.IgnoreCase); 
    if(keyWordMatches.Distinct.Count > 2) 
    { 
    //At this point, do whatever you need to with the original projectDescription match, the Match object will give you the index etc of the match inside the original string. 
    } 
} 
+0

Merci xoxo pour l'aide. Pouvez-vous décrire comment décomposer cette opération en différentes regex? ou donner le nom du livre ou un lien vers un tutoriel ou un guide d'aide qui explique cela? Comme je suis nouveau dans la zone regex, j'ai peu de connaissances sur la façon de le faire. J'utilise C# pour cela. Merci pour votre aide. – Shekhar

+0

J'espère que la modification aide? – xoxo

-1

Essayez

^(details of)?project.*?((client|duration|environment|technologies|role).*?){2}.*$ 

Une note: Cela correspond également si un seul des termes apparaît deux fois.

En C#:

foundMatch = Regex.IsMatch(subjectString, @"\A(?:(details of)?project.*?((client|duration|environment|technologies|role).*?){2}.*)\Z", RegexOptions.Singleline | RegexOptions.IgnoreCase); 
+0

Désolé. J'utilise C# pour cette chose. La requête que vous avez donnée échoue à un seul point. Si la chaîne commence comme "Détails du projet", puis RE donné par vous ne fonctionnera pas. En fait, j'avais créé le même RE que vous avez donné. Comment gérer ce problème? Pouvons-nous vraiment résoudre ce problème en utilisant RE ou devons-nous utiliser une autre approche? – Shekhar

+0

Eh bien, que voulez-vous? Vous avez dit que la chaîne devrait commencer par "Projet". Votre propre chaîne d'exemple ne fonctionne pas. Quelle est exactement la condition que la chaîne doit correspondre? S'il vous plaît modifier votre question pour clarifier. –

+0

@ Tim, Im désolé si je vous ai confondu ppl. Dans le texte que j'ai, les informations relatives au projet peuvent commencer par le mot «projet» ou commencer par «Détails du projet». Je souhaite sélectionner les informations relatives au projet (client, rôle, environnement, technologies utilisées) dans les deux cas. – Shekhar

0

Peut-être que vous avez besoin de briser que les exigences en deux étapes: tout d'abord, prenez vos paires clé/valeur de votre chaîne, que d'appliquer votre filtre.

string input = @"Project #..."; 
Regex projects = new Regex(@"(?<key>\S+).:.(?<value>.*?\.)"); 
foreach (Match project in projects.Matches(input)) 
{ 
    Console.WriteLine ("{0} : {1}", 
     project.Groups["key" ].Value, 
     project.Groups["value"].Value); 
} 
+0

Merci, je vais comprendre comment faire cela et essayer. – Shekhar

2
(client|duration|environment|technologies|role).+(client|duration|environment|technologies|role)(?!\1) 
Questions connexes