8 Stimmen

Wie man Wort für Wort iterieren in Zeichenfolge in C#?

Ich möchte eine Zeichenkette Wort für Wort durchlaufen.

Wenn ich eine Zeichenfolge "incidentno und fintype oder unitno" habe, möchte ich jedes Wort einzeln als "incidentno", "and", "fintype", "or" und "unitno" lesen.

20voto

Guffa Punkte 663241
foreach (string word in "incidentno and fintype or unitno".Split(' ')) {
   ...
}

0 Stimmen

Ich bin mir da nicht sicher, aber ich denke, dass dies bei jeder Iteration zu einer Spaltung führen wird. Sie würden eher haben die Zeichenfolge aufgeteilt und in ein lokales Array, und verwenden Sie dann die "in" Operator auf, dass.

4 Stimmen

@synhershko: Nein, es wird nur einmal geteilt.

0 Stimmen

Das einzige Problem ist die Zeichensetzung, foreach (string word in "now, the end is near".Split(' '))

13voto

Darin Dimitrov Punkte 990883
var regex = new Regex(@"\b[\s,\.-:;]*");
var phrase = "incidentno and fintype or unitno";
var words = regex.Split(phrase).Where(x => !string.IsNullOrEmpty(x));

Dies funktioniert auch, wenn Sie " .,; tabs and new lines " zwischen Ihren Worten.

1 Stimmen

Sie brauchen das ".Where" nicht, wenn Sie die Überladung von Split verwenden, wo Sie StringSplitOptions.RemoveEmptyEntries hinzufügen können.

2 Stimmen

Eine solche Methode gibt es nicht. Ich verwende Regex.Split und nicht String.Split

0 Stimmen

Meiner Meinung nach ist dies die beste Antwort, aber es gibt einen Fehler. Bei den Satzzeichen müssen Sie den Bindestrich auslassen, da er sonst als Bereich definiert wird. Die erste Zeile müsste also eigentlich lauten var regex = new Regex(@"\b[\s,\.\-:;]*");

13voto

JDunkerley Punkte 12089

Ich weiß, es ist etwas verdreht, aber man könnte einen Iterator-Block als Erweiterungsmethode für Strings definieren, z. B.

    /// <summary>
    /// Sweep over text
    /// </summary>
    /// <param name="Text"></param>
    /// <returns></returns>
    public static IEnumerable<string> WordList(this string Text)
    {
        int cIndex = 0;
        int nIndex;
        while ((nIndex = Text.IndexOf(' ', cIndex + 1)) != -1)
        {
            int sIndex = (cIndex == 0 ? 0 : cIndex + 1);
            yield return Text.Substring(sIndex, nIndex - sIndex);
            cIndex = nIndex;
        }
        yield return Text.Substring(cIndex + 1);
    }

        foreach (string word in "incidentno and fintype or unitno".WordList())
            System.Console.WriteLine("'" + word + "'");

Dies hat den Vorteil, dass bei langen Zeichenketten kein großes Array erstellt wird.

2 Stimmen

Mir gefällt diese Alternative, die für große Datenmengen sehr nützlich ist. Dafür haben Sie wirklich ein +1 verdient!

5voto

Mike Cooper Punkte 2715

Verwenden Sie die Split-Methode der String-Klasse

string[] words = "incidentno and fintype or unitno".Split(" ");

Dies wird durch Leerzeichen getrennt, so dass "Wörter" den Wert [incidentno,and,fintype,or,unitno] .

3voto

bbohac Punkte 325

Unter der Annahme, dass die Wörter immer durch ein Leerzeichen getrennt sind, könnten Sie Folgendes verwenden String.Split() um ein Array Ihrer Worte zu erhalten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X