我正在尝试实现一个正则表达式,该正则表达式将字符串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}$
答案 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# demo和regex 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)
,我们摆脱了结果中的整个匹配项,只获取了捕获的子字符串。
注意:如果您的apples
或oranges
可以是非相似字词的替代词,那么您也可以使用替代词:
@"^(\d{1,4}(?:oranges?|tangerines?))?(\d{1,4}(?:apples?|pears?))?(\d{1,4}(?:bananas?|peach(?:es)?))?$"