2017-09-11 5 views
0

j'ai une chaîne:chaînes de capture entre guillemets dans un texte et cartographier leurs index dans un tableau, C#

string text1 = "Lorem \"ipsum dolor\" quisque at \"massa non erat\". Donec auctor \"blandit\" nibh!"; 

Je cherche une solution:

1) attrape tous les mots entre les guillemets doubles et,

2) leur attribue une valeur de 10: si

int[] result = {0,10,10,0,0,10,10,10,0,0,10,0} 

Merci.

+0

Veuillez partager ce que vous avez essayé jusqu'ici. – lintmouse

+0

Si vous n'avez rien essayé, voici une idée. Fractionner la chaîne sur _space_. Ensuite, vérifiez les guillemets doubles dans chacune des chaînes résultantes, le cas échéant, insérez ** 10 **, sinon ** 0 ** dans un tableau de int –

+1

Ce n'est pas un problème algorithmique difficile, essayez de le faire par vous-même. –

Répondre

0

Vérifiez ce programme

var data = "Lorem \"ipsum dolor\" quisque at \"massa non erat\" . Donec auctor \"blandit\" nibh!"; 
     var arrayText = data.Split(' '); 
     int[] result = new int[arrayText.Length]; 
     var i = 0; 
     var doublequotebits = false; 
     foreach (var value in arrayText) 
     { 
      if (value.StartsWith("\"") && value != ".") 
       doublequotebits = true; 

      if (doublequotebits) 
       result[i] = 10; 

      i++; 

      if (value.EndsWith("\"")) 
       doublequotebits = false; 
     } 
3

Essayez ceci:

var text1 = "Lorem \"ipsum dolor\" quisque at \"massa non erat\". Donec auctor \"blandit\" nibh!"; 

var output = 
    text1 
     .Split('"') 
     .SelectMany((x, n) => x.Trim().Split(' ').Select(y => n % 2 == 0 ? 0 : 10)) 
     .ToArray(); 

Il produit int[] result = new [] { 0, 10, 10, 0, 0, 10, 10, 10, 0, 0, 0, 10, 0 }.

Ce n'est pas exactement ce que vous êtes après, mais le fait qu'il ya un . après la deuxième série de guillemets doubles fait ce code penser que . est un mot valide. Vous devrez peut-être réfléchir à la façon de nettoyer cette chaîne en premier.

+0

Il me semble que le code ne fonctionne pas dans le cas où le texte commence par une double citation –

+0

@Englmativity Que diriez-vous: var text1 =" \ "Lorem ipsum dolor \ "quisque à \" massa non erat \ ". Donec auctor \ "blandit \" nibh! "; – ArtJ

+0

@ ZasypinN.V - L'OP a seulement posé des questions sur cette chaîne spécifique, mais en mettant un' .Where (y => y! = "") 'Après le second' .Split (...) 'peut être un correctif suffisant pour l'OP – Enigmativity

1

Vous pouvez utiliser Linq pour y parvenir facilement. Mais si vous voulez une meilleure compréhension de la façon de le faire et que vous voulez que votre code soit plus facilement interprétables et modifiable, je vous suggère d'utiliser le code suivant:

 string text1 = @"Lorem ""ipsum dolor"" quisque at ""massa non erat"".Donec auctor ""blandit"" nibh!"; 
     text1 = text1.Replace("."," "); 
     string[] splitted = text1.Split(' '); 
     List<int> result = new List<int>(); 
     bool alreadystarted = false; 
     foreach (string element in splitted) 
     { 
      if (element.Contains("\"")) 
      { 
       if (alreadystarted == false) 
       { 
        if (element.Count(f => f == '"') != 2) 
        { 
         alreadystarted = true; 
        } 
        result.Add(10); 
       } 
       else 
       { 
        alreadystarted = false; 
        result.Add(10); 
       } 
      } 
      else 
      { 
       if (alreadystarted == true) 
       { 
        result.Add(10); 
       } 
       else 
       { 
        result.Add(0); 
       } 
      } 
     } 

Les résultats int sont:

0, 10, 10, 0, 0, 10, 10, 10, 0, 0, 0, 10, 0