C# 正则表达式多重匹配

标签 c# regex

我想(在 C# 中)检查语法并从字符串中提取一些数据。 检查字符串是否包含:“someWord IS someWord( OR someWord){1-infinite}” 并提取每个单词和第一个单词,将组命名为“switch”

这是我的字符串:

string text = "[bird] IS blue OR yellow OR green";

所以我使用这个正则表达式

string switchPattern = @"\s*(?<switch>.+?)\s+IS\s+(.+?)(?:\s+OR\s+(.+?))+$";

并提取

Match switchCaseMatch = Regex.Match(text, switchCaseOperatorPattern);

这给了我一个包含 4 个元素的组

[0]: [bird] IS blue OR yellow OR green
[1]: green
[2]: blue
[3]: [bird]  named switch

但是我想要

[0]: [bird] IS blue OR yellow OR green
[1]: green
[2]: yellow
[3]: blue
[4]: [bird]  named switch

我希望最后一个“(.+?)”会为所有匹配的情况创建一个组,但它只为最后一次出现的情况创建一个组。我尝试使用 Regex.Matches 得到相同的结果。

我知道我可以用两个正则表达式(一个 Regex.Match 然后 Regex.Matches 为“someWord( OR someWord){1-infinite}”),但我想知道如果只用一个正则表达式就可以做到这一点。

谢谢

最佳答案

实际上,您可以使用 Regex.Match,使用 Captures,正如我在评论中所说的那样。这是一个代码示例:

        string text = "[bird] IS blue OR yellow OR green";
        string switchPattern = @"\s*(?<switch>.+?)\s+IS\s+(.+?)(?:\s+OR\s+(.+?))+$";

        Match switchCaseMatch = Regex.Match(text, switchPattern);
        foreach (Group group in switchCaseMatch.Groups)
        {
            if (group.Captures.Count == 1)
                Console.WriteLine(group.Value);
            else foreach (Capture cap in group.Captures)
                    Console.WriteLine(cap.Value);
        }

这导致:

[bird] IS blue OR yellow OR green
blue
yellow
green
[bird]

参见 Microsoft MSDN page for Captures了解更多信息

关于C# 正则表达式多重匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49925996/

相关文章:

c# - 在父页面更新面板占位符中动态加载新的用户控件

c# - 将 SelectedItem 传递给 DataTemplate 中 UserControl 的 ViewModel

iphone - 使用 NSRegularExpression 匹配 HTML

java - 如何在正则表达式中输入 ":"("colon")?

java - 字符之间的正则表达式匹配

regex - 使用 awk 匹配一个单词,然后找到另一个单词第一次出现的位置

c# - 二维游戏物理资源

c# - 无法在网格单元格内找到控件

c# - Visual Studio 和 .NET 中的条件文件编译

python - 匹配任意分成多行的字符串