Как я могу ограничить строку только первым словом или оптимистичным текстом, не включая первую точку с запятой?

#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:

Вот два решения:

  1. с помощью регулярного выражения:

     public static string GetLettersAtTheStart(string s) {
        return Regex.Match(s, "^[a-zA-Z] ").Value;
    }
      

    Это регулярное выражение соответствует всем символам, которые есть в наборе [a-zA-Z] , который находится в начале строки.

  2. с 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