2010-08-31 4 views
15

Каков наилучший способ вернуть первое слово строки в C#?Функция левой строки в C#

В принципе, если строка "hello world", мне нужно получить "hello".

Благодаря

+0

Является ли пространство единственным персонажем, которого вы хотите разделить словами? Как насчет возврата вкладки, новой строки и каретки? – cwap

+0

расширение комментария cwap: как насчет пунктуации? "Привет мир"? – lalli

ответ

19

Вы можете использовать комбинацию Substring и IndexOf.

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

Однако, это не даст ожидаемого слова, если входная строка имеет только одно слово, так что особый случай необходимости.

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

Я бы добавил специальный случай, если строка содержит только одно слово, например. если ** IndexOf ** возвращает -1. –

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

split.Length. Stack Overflow не позволит мне редактировать его. – crh225

8

Один из способов состоит в поиске пространства в строке, и использовать положение пространства, чтобы получить первое слово:

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

Другой способ заключается в использовании регулярного выражения искать границы слова:

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

Вы можете попробовать:

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

Ohad Schneider's комментарий является правильным, поэтому вы можете просто запросить элемент First(), так как всегда будет хотя бы один элемент.

Для получения дополнительной информации о том, чтобы использовать First() или FirstOrDefault() вы можете узнать больше here

+4

Небольшое улучшение: используйте перегруз для 'String.Split', который принимает максимальное количество расщеплений, поскольку вам все равно, кроме первого раздела. – Richard

+1

Вам не нужно 'FirstOrDefault', всегда будет хотя бы один элемент, поэтому вы можете просто написать' First' (даже если нет места, вы получите всю строку). –

+0

Ваше решение правильно, нет необходимости «пытаться». – Heinzi

2

answer of Jamiec является наиболее эффективным, если вы хотите разделить только на пространствах. Но, ради разнообразия, вот еще одна версия:

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

В качестве бонуса это также будет распознавать all kinds of exotic whitespace characters и проигнорирует несколько последовательных пробельных символов (в действительности он обрезает начальные/конечные пробелы из результата) ,

Обратите внимание: он будет считать символы буквами, поэтому, если ваша строка Hello, world!, она вернет Hello,. Если вам это не нужно, то передайте массив разделителей в первом параметре.

Но если вы хотите, чтобы это было 100% защиты на всех языках мира, то это будет жестко ...

2

бессовестно украдены с сайта MSDN (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

Обрабатывает различные символы пробелов, пустую строку и строку одного слова.

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

Вместо того чтобы делать Split для всех струны, Ограничьте Split сосчитать 2. Используйте перегрузку, которая также учитывает значение параметра.Используйте String.Split Method (Char[], Int32)

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

Split всегда будет возвращать массив с, по меньшей мере, один элемент, так как .[0] или First достаточно.

0

Я использовал эту функцию в своем коде. Он предоставляет возможность либо заглавничать первое слово, либо каждое слово.

 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; 
     } 
    } 
Смежные вопросы