当使用OR时,C#中的Regex集合组

本文关键字:中的 Regex 集合 OR | 更新日期: 2023-09-27 18:26:44

如果我有以下代码:

Regex xp = new Regex(@"('*'*)(.+?)'*'*|('*)([^'*]+)'*");
string text = @"*hello* **world**";
MatchCollection r_Matches = xp.Matches(text);
foreach (Match m in r_Matches)
{
    Console.WriteLine(m.Groups[1].ToString());
    Console.WriteLine(m.Groups[3].ToString());
}
// Outputs:
// ''
// '*'
// '**'
// ''

如何运行上面的正则表达式,并使OR两边的第一个集合的结果出现在同一位置?(例如,Groups[1]返回**_,我认为这不是C#中Regex的工作方式,但这是可以实现的吗?如果是,如何实现?)

当使用OR时,C#中的Regex集合组

您可以使用反向引用:

Regex xp = new Regex(@"('*{1,2})(.+?)'1");
string text = @"*hello* **world**";
MatchCollection r_Matches = xp.Matches(text);
foreach (Match m in r_Matches)
{
    Console.WriteLine(m.Groups[1].ToString());
}

这将匹配任何字符中的一个或多个后面的***,直到它找到之前匹配的内容(***)。

正如一位评论者所说,您可以为此使用命名组。NET比大多数其他regex风格更灵活,因为它允许您在regex的不同部分使用相同的名称,没有任何限制。使用此正则表达式:

@"(?<delim>'*'*)(?<content>.+?)'*'*|(?<delim>'*)(?<content>[^*]+)'*"

你可以这样提取你感兴趣的部分:

foreach (Match m in r_Matches)
{
    Console.WriteLine("Delimiter: {0}'nContent: {1}",
                      m.Groups["delim"].Value,
                      m.Groups["content"].Value);
}

这就是它的全部。与其他评论相反,你不必在GroupCollections或CaptureCollections或其他什么东西上乱搞。

请注意,这个特殊的问题几乎可以用任何方式轻松解决。只是.NET比大多数更灵活。