Получить подстроку с «текстом пробелом номером» и обрезать остальное

#c# #regex #string #substring

#c# #регулярное выражение #строка #подстрока

Вопрос:

Как вы можете написать функцию / регулярное выражение, которое дает вам первый блок символов первые числа, не разделенные пробелом, и опустить остальное? Вот несколько примеров того, как должен выглядеть результат с учетом разных строк («ввод» -> «результат»):

 "abc 1" -> "abc 1"
"abc def 1" -> "abc def 1"
"abc-def 1" -> "abc-def 1"
"abc 1b" -> "abc 1"
"abc 11 b3" -> "abc 11"
"abc 11 3" -> "abc 11"
"abc 11b" -> "abc 11"
 

Комментарии:

1. может быть, это [a-zA-Z]* d* . или это S* d*

2. Я только что проверил это, но я выбрал регулярное выражение для удобства чтения, спасибо.

Ответ №1:

Один из способов (слова состоят из a-z -)

 Match match = Regex.Match(value, @"^([A-Za-z-] ) (d )");
if (match.Success)
{
    var word = match.Groups[1].Value;
    var num  = match.Groups[2].Value;
}
 

Комментарии:

1. Вы не соответствовали второй строке. На самом деле так и должно быть ^([A-Za-z- ] ) (d ) .

Ответ №2:

  class Program
    {
        static void Main(string[] args)
        {

            string[] Value = new string[] {
 "abc 1",
"abc def 1",
"abc-def 1",
"abc 1b",
"abc 11 b3",
"abc 11 3",
"abc 11b"
            };


            foreach (string value in Value)
            {
                Match match = Regex.Match(value, @"^([A-Za-z-] ) (d )");
                if (match.Success)
                {
                    var word = match.Groups[1].Value;
                    var num = match.Groups[2].Value;
                    Console.WriteLine(word   " "   num);
                }
            }

        }
    }


//abc 1
//abc-def 1
//abc 1
//abc 11
//abc 11
//abc 11
 

Ответ №3:

Вот решение LINQ с использованием TakeWhile SkipWhile методов и . (Я протестировал все ваши записи, и это работает):

 string str = "abc 11 3";
var result = string.Concat(string.Join("", str.TakeWhile(c => !char.IsDigit(c))),
             string.Join("", str.SkipWhile(c => !char.IsDigit(c)).TakeWhile(char.IsDigit)));
 

Только не забудьте сначала добавить using System.Linq; в свою using директиву.

Ответ №4:

Это должно сработать…

^(.*)[0-9]