2009-08-24 6 views
1

Gibt es einen Weg, um die Zeichenfolge zu erhalten zwischen .. sagen wir Zitat „ Das Problem bei der Verwendung INDEXOF und Teilzeichenfolge ist, dass es die erste bekommt“ und zuletzt ", aber nicht das Paar. WieZeichenfolge zwischen Funktion?

‚Hallo‘ "Warum", "WWWWWEEEEEE"

Es

Hallo bekommen " "Warum"" WWWWWEEEEEE

Ich möchte, dass es zum Array kommt> Hallo, WARUM SIND WWWWEEEEEE

Gibt es eine Möglichkeit, dies zu tun?

Antwort

7

So etwas wie das?

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 
} 

Wenn subjectString war "Hallo" "Warum" "WWWWWEEEEEE", dass sollten Sie eine Liste geben enthält:

  • Hallo
  • WARUM SIND
  • WWWWWEEEEEE

Eine kompaktere Beispiel die stattdessen die statische Regex-Klasse verwendet, und schreibt nur die Spiele statt auf die Konsole der zu einer Sammlung hinzufügen:

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

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

Soweit ich weiß, können Sie es vereinfachen, indem Sie den try-catch entfernen, denn wenn Sie einmal ausgeführt werden, wissen Sie bereits, dass der reguläre Ausdruck keine Syntaxfehler enthält. – Svish

+1

Wenn Sie die Zwischenräume auch möchten, können Sie einfach die Anführungszeichen und die Gruppe entfernen und das ganze Spiel nehmen. Ersetzen Sie '" ([^ "] +)" 'durch' [^ "] +' und 'match.Groups [1] .Value" durch 'match.Value'. – Svish

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

Wenn Sie nicht die leeren Saiten möchten, können Sie durch '" "' aufgeteilt, wobei in diesem Fall werden Sie ['"Hello', "WHY ARE", 'WWWWWEEEEEE"'] bekommen.

Auf der anderen Seite könnte die Verwendung von regulären Ausdrücken die beste Lösung für das sein, was Sie wollen. Ich bin kein C# -Experte, daher kann ich den Code nicht von oben geben, aber das ist die Regex, die Sie verwenden möchten: "(.*?)"

+0

Es wird nicht funktionieren. Es wird alle Dinge zwischen dem o "und" W auch haben. Ich möchte nur die HELLO, etc. –

+0

sollten Sie '([^"] +) 'anstelle von' (. *?) 'Verwenden, weil es effizienter ist, und überspringt die leeren, wie' "" ' – Svish

+0

([^ "] +) ist effizienter, das stimmt. Aber der OP hat nicht gesagt, dass er keine leeren fangen will. –

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

sollte es tun,

Güte,

Dan

+0

Dies würde [Hallo, WARUM, SIND, WWWWWEEEEEE] –

+0

guten Punkt, editting jetzt :) –

0

Sie können auch die String.IndexOf(char value, int startIndex) Methode verwenden, die hat als Parameter sagt, ein Startindex, von dem Der Scan wird gestartet.

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); 
Verwandte Themen