2009-08-24 3 views
1

Y at-il un moyen d'obtenir la chaîne entre .. permet de dire citation « Le problème avec l'utilisation INDEXOF et qu'il est sous-chaîne obtient le premier » et dernier "mais pas la paire. CommeChaîne entre fonction?

« Bonjour » "Pourquoi" "WWWWWEEEEEE"

Il se

Bonjour " "POURQUOI SONT"" WWWWWEEEEEE

Je veux qu'il se rende à la matrice> Bonjour, POURQUOI, WWWWEEEEEE

Y at-il un moyen de le faire?

Répondre

7

Quelque chose comme ça?

StringCollection resultList = new StringCollection(); 
try 
{ 
    Regex regexObj = new Regex("\"([^\"]+)\""); 
    Match matchResult = regexObj.Match(subjectString); 

    while (matchResult.Success) 
    { 
     resultList.Add(matchResult.Groups[1].Value); 
     matchResult = matchResult.NextMatch(); 
    } 
} 
catch (ArgumentException ex) 
{ 
    // Syntax error in the regular expression 
} 

Si subjectString était "Bonjour" "POURQUOI SONT" "WWWWWEEEEEE", que vous devez donner une liste contenant:

  • Bonjour
  • Pourquoi êtes-
  • WWWWWEEEEEE

Un exemple plus compact qui utilise la Regex plutôt classe statique, et écrit simplement les matchs à la console au lieu d'ajouter à une collection:

var subject = "\"Hello\" \"WHY ARE\" \"WWWWWEEEEEE\""; 
var match = Regex.Match(subject, "\"([^\"]+)\""); 

while (match.Success) 
{ 
    Console.WriteLine(match.Groups[1].Value); 
    match = match.NextMatch(); 
} 
+0

Pour autant que je sache, vous pouvez le simplifier en supprimant le try-catch, car une fois exécuté, vous savez déjà que l'expression régulière ne contient aucune erreur de syntaxe. – Svish

+1

Si vous voulez que les espaces entre eux aussi vous pouvez simplement supprimer les guillemets et le groupe et prendre le match entier. Remplacer '" ([^ "] +)" 'par' [^ "] +', et 'match.Groups [1] .Value' par' match.Value'. – Svish

2
string s = '"Hello" "WHY ARE" "WWWWWEEEEEE"' 
string[] words = s.Split('"'); 
// words is now ["Hello", " ", "WHY ARE", " ", "WWWWWEEEEEE"] 

Si vous ne voulez pas les chaînes vides, vous pouvez diviser par '" "', dans ce cas, vous obtiendrez ['"Hello', "WHY ARE", 'WWWWWEEEEEE"']. D'autre part, l'utilisation d'expressions régulières pourrait être la meilleure solution pour ce que vous voulez. Je ne suis pas un expert C#, donc je ne peux pas donner le code du haut de ma tête, mais c'est la regex que vous voulez utiliser: "(.*?)"

+0

Cela ne fonctionnera pas. Il aura toutes les choses entre l'o "et" W aussi. Je veux seulement le BONJOUR, etc. –

+0

vous devriez utiliser '([^"] +) 'au lieu de' (. *?) 'Parce qu'il est plus efficace, et passera les vides, comme' "" ' – Svish

+0

([^ "] +) est plus efficace, c'est vrai. Mais l'OP n'a pas dit qu'il ne voulait pas attraper les vides. –

0
string s = '"Hello" "WHY ARE" "WWWWWEEEEEE" 
s.replace("\" \"", "!*!"); // custom seperator 
s.Replace('"', string.empty); 
string[] words = s.Split('!*!'); 

devrait faire l'affaire,

Bonté,

Dan

+0

cela donnerait [Bonjour, POURQUOI, SONT, WWWWWEEEEEE] –

+0

bon point, en éditant maintenant :) –

0

Vous pouvez également utiliser la méthode String.IndexOf(char value, int startIndex) qui a, comme paramètre dit, un indice de départ à partir duquel l'analyse est démarrée.

int start = 0; 
do 
{ 
    int i1 = s.IndexOf('=', start); 
    if (i1 < 0) break; 

    int i2 = s.IndexOf('=', i1 + 1); 
    if (i2 < 0) break; 

    yield return s.Substring(i1, i2 - i1); 
    start = i2 + 1; 
} 
while (start < s.Length); 
Questions connexes