我想(在 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/