Регулярное выражение, которое проверяет количество цифр

#regex

#регулярное выражение

Вопрос:

У меня есть строка, которая содержит что-то вроде этого number: -7-972/516/57.15 . Выражение должно возвращать количество цифр и фильтровать по первому числу. В результате я хочу видеть: 79725165715 . Я написал это выражение ^(D*) 7 (D*(?:dD*){10})$ , но у этого выражения возникла проблема «Катастрофического возврата» (зависает при выполнении) с длинными строками типа: bt.rfznascvd@rcs.ru,e.zovtrnko@lkn.ru

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

1. Вы тестировали его на тестере регулярных выражений ?

2. regexr.com/4ach8 этот тестер регулярных выражений имеет ту же ошибку, что и моя программа kotlin

3. Почему у вас есть after (D*) ? Поскольку D* уже указано, что символы могут повторяться, нет смысла использовать другой квантификатор после него. Вы просто повторяете повтор.

4. Т.е. между (D*) 7 и (D*)7 нет разницы. Если вы хотите потребовать хотя бы один нечисловой символ перед 7 , он должен быть (D )7 .

5. Регулярное выражение не может возвращать количество, оно просто возвращает ту часть входных данных, которая соответствует ему, вместе с частями, которые соответствуют группам захвата. Я также не понимаю, что вы подразумеваете под «фильтровать по первому номеру».

Ответ №1:

Я пишу новое, и это работает: D*7(dD*){10}

Ответ №2:

Вам просто нужно использовать d . Использование Matches даст вам все совпадения в шаблоне из рассматриваемой строки. Count это даст вам количество совпадений. И для объединения их в строку я создал небольшой метод расширения. Для тестирования ваших регулярных выражений я могу посоветовать regexlib.

 namespace CSharpTest
{
    using System.Text;
    using System.Text.RegularExpressions;

    public static class Program
    {
        static void Main(string[] args)
        {
            string input = @"number: -7-972/516/57.15";

            var regex = new Regex(@"d");

            var matches = regex.Matches(input);

            var countOfNumbers = matches.Count;
            var number = matches.ToNumber();
        }

        public static string ToNumber(this MatchCollection matches)
        {
            var result = new StringBuilder();

            foreach (Match match in matches)
                result.Append(match.Value);

            return result.ToString();
        }
    }
}
  

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

1. Это верно, но я могу использовать только одно совпадение регулярных выражений для получения логического результата без других функций

2. «Выражение должно возвращать количество цифр», о каком результате bool вы говорите? И RegEx используется только для проверки и получает совпадения из входных данных. Вы можете принимать значение bool только как информацию о совпадениях ( learn.microsoft.com/ru-ru/dotnet/api /… )