Захват первого совпадения с помощью регулярного выражения (C #) - PullRequest
5 голосов
/ 02 декабря 2009

Это мой первый опыт работы с C # и часть моего ограниченного опыта с регулярными выражениями, и у меня возникают проблемы с захватом первого совпадения в определенном выражении. Я полагаю, что следующий пример пояснит, что я хочу сделать, более понятным, чем слова.

Match extractor = (new Regex(@".*\d(?<name>.*)\d.*")).Match("This hopefully will pick up 1Bob9error1 as a name");
        Console.WriteLine(extractor.Groups["name"]);

Я бы хотел, чтобы это выражение печатало «Боб» вместо «ошибка».

У меня есть догадка, это как-то связано с? перед соответствующей группой, но я не совсем уверен, какая операция? выполняет в этом конкретном случае. Объяснение вместе с некоторой помощью было бы замечательно.

Спасибо, ребята, вы не представляете, насколько этот сайт помогает начинающему программисту, как я.

Ответы [ 4 ]

7 голосов
/ 02 декабря 2009

Ваша проблема в жадности. Regex жадность это. Ваш. * В начале захватывает все это "Надеюсь, это поднимет 1Bob" вместо этого попробуйте это регулярное выражение:

\d(?<name>[^\d]+)\d
3 голосов
/ 02 декабря 2009

Соответствует предыдущему элементу ноль или один раз. это эквивалентно {0,1}. ? это жадный квантификатор, не жадный эквивалент которого ??.

Взято из здесь . На сайте есть шпаргалка для регулярных выражений, и, глядя на ваше выражение, я не могу понять, что с ним не так.

Я предполагаю, что это может совпадать с последним вхождением вашего выражения.

2 голосов
/ 02 декабря 2009

Символы * в скобках вокруг вашего выражения вызывают у вас проблемы. Помните, что вам не нужно регулярное выражение, совпадающее со строкой whole - вы хотите, чтобы оно совпадало только с конкретным шаблоном, когда он появляется. Работает следующий код:

Regex pattern = new Regex(@"\d(?<name>.*?)\d");
MatchCollection matches = pattern.Matches("This hopefully will pick up 1Bob9error1 as a name");
Console.WriteLine(matches[0].Groups["name"]);
2 голосов
/ 02 декабря 2009

Каждый элемент группы имеет коллекцию Captures, вы можете получить доступ к первому захвату для группы, используя:

extractor.Groups["name"].Captures[0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...