Принимая выбранные группы в регулярных выражениях - PullRequest
1 голос
/ 03 июня 2019

Я пытаюсь реализовать регулярное выражение, которое принимает строку 3oranges в качестве одной группы и не принимает более 1 соответствия для этой строки. Я также хочу дать строку 3oranges2apples4bananas, и это должно дать 3 различные группы соответственно.

Я попытался создать регулярное выражение, которое получает совпадения так, как я хочу, но не дает только одну группу в качестве совпадения. Это дает 2 для каждого матча: 3oranges дает oranges и 3oranges как совпадения.

Вот регулярное выражение, которое я написал. Я пишу это так, потому что я хочу ограничить порядок, в котором предоставляются данные, а также хочу убедиться, что я получу ограниченное количество цифр для последующей обработки.

^(\d{1,4}(orange)){0,1}(\d{1,4}(apple)){0,1}(\d{1,4}(banana)){0,1}$

Как я уже говорил ранее, я хочу получить только одну группу для желаемого матча.

INPUT: 
3oranges2apples4bananas

OUTPUT: Matches found
3oranges
oranges
2apples
apples
4bananas
bananas

DESIRED OUTPUT:
3oranges
2apples
4bananas

Возможно ли то, что я прошу, и если да, то как мне этого добиться?

РЕДАКТИРОВАТЬ 1: Я не осознавал важности последующего вопроса, который у меня был к этому вопросу, но я не буду терять время. Я также хочу считать это oranges, если текст o, orange или oranges
Примерно так:

^(\d{1,4}(oranges|orange|o)){0,1}(\d{1,4}(apples|apple|a)){0,1}(\d{1,4}(bananas|banana|b)){0,1}$

1 Ответ

3 голосов
/ 03 июня 2019

Вы можете использовать

var s = "3oranges2apples4bananas";
var ms = Regex.Match(s, @"^(\d{1,4}o(?:ranges?)?)?(\d{1,4}a(?:pples?)?)?(\d{1,4}b(?:ananas?)?)?$");
var results = ms.Groups.Cast<Group>().Select(y => y.Value).Skip(1);
Console.WriteLine(string.Join(", ", results));
// => 3oranges, 2apples, 4bananas

См. Демонстрацию C # и демонстрацию regex .

Детали шаблона

  • ^ - начало строки
  • (\d{1,4}o(?:ranges?)?)? - Группа 1 (необязательно): от 1 до 4 цифр, а затем orange с последующей необязательной буквой s илиo
  • (\d{1,4}a(?:pples?)?)? - Группа 2 (необязательно): от 1 до 4 цифр, а затем apple, за которыми следует дополнительная буква s или a
  • (\d{1,4}b(?:ananas?)?)? -Группа 3 (необязательно): от 1 до 4 цифр, затем banana, за которыми следует необязательная s буква или b
  • $ - конец строки.

С ms.Groups.Cast<Group>().Select(y => y.Value).Skip(1) мы избавляемся от всего совпадения в результатах и ​​получаем только захваченные подстроки.

ПРИМЕЧАНИЕ Если ваш apples или oranges может быть чередованием не-подходные слова вы также можете использовать чередование:

@"^(\d{1,4}(?:oranges?|tangerines?))?(\d{1,4}(?:apples?|pears?))?(\d{1,4}(?:bananas?|peach(?:es)?))?$"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...