2009-05-11 5 views
0

Supposons que j'ai la chaîne "1 AND 2 AND 3 OR 4" et que je souhaite créer un tableau de chaînes contenant toutes les sous-chaînes "AND" ou "OR", afin , trouvé dans la chaîne. Donc, la chaîne ci-dessus retournera un tableau de chaînes de {"AND", "AND", "OR"}.C#: trouver des instances d'une chaîne dans une chaîne

Quelle serait une façon intelligente d'écrire cela?

EDIT: utilisant C# 2.0+,

string rule = "1 AND 2 AND 3 OR 4"; 
string pattern = "(AND|OR)"; 
string[] conditions = Regex.Split(rule, pattern); 

me donne { "1", "ET", "2", "ET", "3", "OU", "4"} , ce qui n'est pas tout à fait ce que je cherche. Comment puis-je réduire cela aux AND et aux OR seulement?

+0

Je peux voir ce que vous essayez de faire mais je ne pense pas que l'approche 'Split' est la plus appropriée pour ce que vous voulez. Voir le Split est la séparation de l'entrée aux ANDs et ORs résultant ainsi dans les nombres (et seulement les AND/ORs coz de la parenthèse) - ce qui n'est pas ce que vous voulez. Vous voulez les AND et les ORs. Je pense qu'un motif regex spécialement conçu pourrait renvoyer plusieurs correspondances, capturant ainsi uniquement les AND et les OR. –

+0

Pourriez-vous expliquer le but si cette exigence? Cela pourrait aider à concevoir une regex plus appropriée. –

Répondre

1

Cette regex (.NET) semble faire ce que vous voulez. Vous recherchez les matchs (multiples) dans le groupe à l'index = 1:

.*?((AND)|(OR))*.*? 

EDIT Je l'ai testé ce qui suit et il semble faire ce que vous voulez. Il est plus de lignes que je voudrais, mais il se rapproche de la tâche d'une manière purement regex (qui à mon humble avis est ce que vous devez faire):

 string text = "1 AND 2 AND 3 OR 4"; 
     string pattern = @"AND|OR"; 

     Regex r = new Regex(pattern, RegexOptions.IgnoreCase); 

     Match m = r.Match(text); 
     ArrayList results = new ArrayList(); 
     while (m.Success) 
     { 
      results.Add(m.Groups[0].Value); 

      m = m.NextMatch(); 
     } 

     string[] matchesStringArray = (string[])results.ToArray(typeof(string)); 
+0

Pourquoi ne pas simplement "(ET | OR)"? – cdmckay

+0

* hausse les épaules * Peut-être que je l'ai compliqué. –

+0

En C# 2.0+, en utilisant "AND | OR" comme le modèle me donne plus que juste les AND et les ORs - comment puis-je limiter le modèle pour me donner seulement les AND et les OR? J'ai modifié la question ci-dessus. –

1

Puisque vous connaissez la sous-chaîne exacte que vous cherchez ... pourquoi pas seulement utiliser IndexOf(substr, iOffset) pour connaître le nombre d'occurrences (boucle jusqu'à ce qu'il renvoie -1) ??

En fonction de la complexité de votre tâche, il pourrait être plus simple/plus rapide que d'utiliser des expressions régulières (puisque vous ne correspondez pas à des modèles).

0

Voici une manière loufoque que je suis venu avec:

string rule = "1 AND 2 AND 3 OR 4"; 
List<string> andsOrs = new List<string>(); 
string[] split = rule.Split(); 
for (int i = 0; i < split.Length; i++) 
{ 
    if (split[i] == "AND" || split[i] == "OR") 
    { 
     andsOrs.Add(split[i]); 
    } 
} 
string[] conditions = andsOrs.ToArray(); 
return conditions; 
1
string rule = "1 AND 2 AND 3 OR 4"; 
string pattern = "(AND|OR)"; 
MatchCollection conditions = Regex.Matches(rule, pattern); 

Utilisez Match.Value pour obtenir la chaîne.