#c# #string #limit
#c# #строка #ограничить
Вопрос:
У меня есть строка, которая содержит такие слова:
var a = "abc";
var a = "abc;";
var a = "abc; def";
var a = "abc def";
var a = "abc; def";
Есть ли у кого-нибудь какие-либо предложения о том, как я мог бы создать новую строку, которая во всех этих случаях (включая, если символом завершения была точка или что-либо другое, кроме a-z и A-Z), состояла бы только из «abc»?
Комментарии:
1. Итак, вы хотите прекратить получать буквы, если натыкаетесь на пробел или точку с запятой? Что-нибудь еще (как насчет вкладок? возврат каретки? перевод строк? точка останавливается?)?
2. Что
Char.IsLetter
делает? ЧтоTakeWhile
делает?3. Хороший момент. Мне нужно прекратить получать буквы, если я вижу пробел, точку с запятой, табуляцию или точку после запятой. На самом деле все, что не является обычной буквой
4. Вы хотите только
"abc"
или также"def"
?5.
Regex
может быть полезно (при условии, что это английский алфавит и ASCII).
Ответ №1:
Несколько примеров:
// Using regex, assuming English alphabet and ASCII
var a = Regex.Split("abc;abc", "[^a-zA-Z]").First();
// Using System.Linq, preferable!
var b = string.Concat("abc abc".TakeWhile(c => char.IsLetter(c)));
Ответ №2:
Вот два решения:
-
с помощью регулярного выражения:
public static string GetLettersAtTheStart(string s) { return Regex.Match(s, "^[a-zA-Z] ").Value; }
Это регулярное выражение соответствует всем символам, которые есть в наборе
[a-zA-Z]
, который находится в начале строки. -
с
TakeWhile
:public static string GetLettersAtTheStart(string s) { return string.Join("", s.TakeWhile(char.IsLetter)); }
Это в основном говорит о том, что продолжайте брать символы из строки, пока это буква, а затем соединять их пустой строкой.
Использование:
GetLettersAtTheStart("abc; def") // "abc"
Ответ №3:
Чтобы остановить строку после любого небуквенного символа, вы можете использовать эту функцию.
public static string limitString(string text) {
string newString = "";
foreach (char character in text) {
if (Char.IsLetter(character)) {
newString = character;
} else {
break;
}
}
return newString;
}
Пример использования:
limitString("abc; def");
В результате получилась бы строка abc
.
Если вы хотите остановить строку после определенных символов, эта функция должна работать.
public static string limitString(string text, List<char> characters) {
foreach (char character in characters) {
text = text.Split(character)[0];
}
return text;
}
Пример использования:
List<char> limChars = new List<char>() { ';' };
limitString("test;", limChars);
Для получения строки test
вы также можете ограничить количество символов, добавив в список больше элементов.
Комментарии:
1. Почему бы не использовать
string.Split
перегрузку для получения более одного разделителя… Кроме того, ваша функция вернет результат по последнему использованному разделителю, который может быть неправильным… Вы хотите в первую очередь разделять, используя все разделители…
Ответ №4:
Один из простых способов — использовать регулярное выражение. Вы можете сделать это с помощью @"^[a-zA-Z]*"
. Ваш код может выглядеть следующим образом:
string getString(String str)
{
var regex = new Regex(@"^[a-zA-Z]*");
return regex.Match(str).Value;
}
Вы также могли бы перебирать каждый символ, проверяя, является ли он алфавитным:
string getString2(String str)
{
string resultString = "";
foreach (char c in str)
{
if (Char.IsLetter(c))
resultString = c;
else
break;
}
return resultString;
}
Ответ №5:
Как упоминалось в комментариях, вы можете использовать TakeWhile
. Это будет выглядеть следующим образом:
string.Concat(a.TakeWhile(char.IsLetter))
вывод всегда будет:
abc