接受正则表达式中的选定组

时间:2019-06-03 09:06:20

标签: c# regex

我正在尝试实现一个正则表达式,该正则表达式将字符串3oranges作为一个组,并且对该字符串的匹配项不超过1个。我也想给字符串3oranges2apples4bananas,这应该相应地给3个不同的组。

我尝试创建一个正则表达式,该正则表达式以我想要的方式获取匹配项,但不只提供一组作为匹配项。每个匹配项给出2:3oranges给出oranges3oranges作为匹配项。

这是我写的正则表达式。我之所以这样写,是因为我想限制给出数据的顺序,并且还想确保以后得到的位数有限。

^(\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: 我没有意识到跟这个问题有关的后续问题的重要性,但是我不会浪费任何时间。 如果文本是orangesoorange,我也想将其视为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 个答案:

答案 0 :(得分:3)

您可以使用

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# demoregex demo

模式详细信息

  • ^-字符串的开头
  • (\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),我们摆脱了结果中的整个匹配项,只获取了捕获的子字符串。

注意:如果您的applesoranges可以是非相似字词的替代词,那么您也可以使用替代词:

@"^(\d{1,4}(?:oranges?|tangerines?))?(\d{1,4}(?:apples?|pears?))?(\d{1,4}(?:bananas?|peach(?:es)?))?$"