c# - 在正则表达式中选择组

标签 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: 我没有意识到我必须对这个问题提出后续问题的重要性,但我不会浪费任何时间。 如果文本是 oorangeoranges
,我也想将其视为 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}$

最佳答案

你可以使用

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)?))?$"

关于c# - 在正则表达式中选择组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56424176/

相关文章:

c# - DependencyProperty 忽略了一些 PropertyChanged 调用

c# - 将自定义命令设置为以编程方式创建的按钮

带有正则表达式的 Python difflib

python - 使用正则表达式删除单词中的空格 - 用于文本挖掘的预处理数据

Javascript 正则表达式 - 将 * 与多个字符一起使用

c# - Kendo UI 自动完成打开两次

c# - 在 MVVM 中使用一个 View 对多种类型进行 CRUD

c# - 自动调整winform中的控件大小

javascript - 如何在字符串中选择星号并设置其样式?

javascript - jQuery/JavaScript 干净的字符串,因此只有单词存在