2010-08-31 7 views
15

Was ist der beste Weg, das erste Wort einer Zeichenkette in C# zurückzugeben?Linke Zeichenfolgenfunktion in C#

Grundsätzlich, wenn die Zeichenfolge "hello world" ist, muss ich "hello" bekommen.

Dank

+0

Ist Platz das einzige Zeichen, das Sie Wörter trennen möchten? Was ist mit Registerkarte, Zeilenumbruch und Wagenrücklauf? – cwap

+0

Erweitern Cwaps Kommentar: Was ist mit Interpunktionen? "Hallo Welt"? – lalli

Antwort

19

Sie können eine Kombination von Substring und IndexOf verwenden.

var s = "Hello World"; 
var firstWord = s.Substring(0,s.IndexOf(" ")); 

Dies wird jedoch nicht das erwartete Wort geben, wenn die eingegebene Zeichenkette nur ein Wort hat, so ein Sonderfall erforderlich ist.

var s = "Hello"; 
var firstWord = s.IndexOf(" ") > -1 
        ? s.Substring(0,s.IndexOf(" ")) 
        : s; 
+6

Ich würde einen Sonderfall hinzufügen, wenn die Zeichenfolge nur ein Wort enthält, z. wenn ** IndexOf ** -1 zurückgibt. –

0
string words = "hello world"; 
string [] split = words.Split(new Char [] {' '}); 
if(split.Length >0){ 
string first = split[0]; 
} 
+0

split.Length. Stack Overflow lässt mich nicht editieren. – crh225

8

Eine Möglichkeit ist, für einen Platz in der Zeichenfolge zu suchen, und die Position des Raumes nutzt das erste Wort zu bekommen:

int index = s.IndexOf(' '); 
if (index != -1) { 
    s = s.Substring(0, index); 
} 

Eine andere Möglichkeit ist es, einen regulären Ausdruck zu verwenden, zur suche nach einer Wortgrenze:

s = Regex.Match(s, @"(.+?)\b").Groups[1].Value; 
35

können Sie versuchen:

string s = "Hello World"; 
string firstWord = s.Split(' ').First(); 

Ohad Schneider's Kommentar ist richtig, so können Sie einfach nach dem Element fragen, da es immer mindestens ein Element geben wird.

Für weitere Informationen darüber, ob First() verwenden oder FirstOrDefault() können Sie mehr here

+4

Leichte Verbesserung: Verwenden Sie die Überladung für 'String.split', die eine maximale Splits-Zählung benötigt, da Sie nicht alle außer dem ersten Abschnitt interessieren. – Richard

+1

Sie brauchen 'FirstOrDefault' nicht, es wird immer mindestens ein Element geben, so dass Sie nur' First' schreiben können (auch wenn es keinen Platz gibt, erhalten Sie die gesamte Zeichenfolge). –

+0

Ihre Lösung ist richtig, Sie müssen nicht "versuchen". – Heinzi

2

Die answer of Jamiec ist die effizienteste lernen, wenn Sie nur auf Räume geteilt werden soll. Aber nur um Abwechslung, hier ist eine andere Version:

var FirstWord = "Hello World".Split(null, StringSplitOptions.RemoveEmptyEntries)[0]; 

Als Bonus dies auch all kinds of exotic whitespace characters erkennen und wird mehrere aufeinander folgende Leerzeichen ignorieren (in der Tat wird es die führende/nachfolgende Leerzeichen aus dem Ergebnis trimmen) .

Beachten Sie, dass Symbole auch als Buchstaben gezählt werden. Wenn Ihre Zeichenfolge also Hello, world! lautet, wird Hello, zurückgegeben. Wenn Sie das nicht benötigen, übergeben Sie im ersten Parameter ein Array mit Trennzeichen.

Aber wenn Sie es wollen, in allen Sprachen der Welt 100% narrensicher sein, dann hart es geht zu bekommen ...

2

Schamlos von der MSDN-Site gestohlen (http://msdn.microsoft.com/en-us/library/b873y76a.aspx)

string words = "This is a list of words, with: a bit of punctuation" + 
    "\tand a tab character."; 

string [] split = words.Split(new Char [] {' ', ',', '.', ':', '\t' }); 

if(split.Length > 0) 
{ 
    return split[0]; 
} 
1

Verarbeitet die verschiedenen Leerzeichen, die leere Zeichenfolge und die Zeichenfolge eines einzelnen Worts.

private static string FirstWord(string text) 
{ 
    if (text == null) throw new ArgumentNullException("text"); 

    var builder = new StringBuilder(); 

    for (int index = 0; index < text.Length; index += 1) 
    { 
     char ch = text[index]; 
     if (Char.IsWhiteSpace(ch)) break; 

     builder.Append(ch); 
    } 

    return builder.ToString(); 
}
1

Statt Split für die ganze Zeichenfolge zu tun, Ihr Split Limit von 2 zu zählen. Verwenden Sie die Überladung, die auch als Parameter zählt.Verwenden String.Split Method (Char[], Int32)

string str = "hello world"; 
string firstWord = str.Split(new[]{' '} , 2).First(); 

Split wird immer ein Array zurück mit mindestens einem Element, also entweder .[0] oder First genug ist.

0

Ich habe diese Funktion in meinem Code verwendet. Es bietet die Möglichkeit, entweder das erste Wort oder jedes einzelne Wort in Großbuchstaben zu schreiben.

 public static string FirstCharToUpper(string text, bool firstWordOnly = true) 
    { 
     try 
     { 
      if (string.IsNullOrEmpty(text)) 
      { 
       return text; 
      } 
      else 
      { 
       if (firstWordOnly) 
       { 
        string[] words = text.Split(' '); 
        string firstWord = words.First(); 
        firstWord = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(firstWord.ToLower()); 
        words[0] = firstWord; 
        return string.Join(" ", words); 
       } 
       else 
       { 
        return System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(text.ToLower()); 
       } 
      } 
     } catch (Exception ex) 
     { 
      Log.Exc(ex); 
      return text; 
     } 
    }