#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 /… )