1

如果我有以下代码:

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] 返回**or _,我认为这不是 C# 中的正则表达式的工作方式,但这是可以实现的吗?如果可以,如何实现?)

4

2 回答 2

1

您可以使用反向引用

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());
}

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

于 2013-08-07T21:32:46.973 回答
0

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

@"(?<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 比大多数更灵活。

于 2013-08-08T00:03:29.523 回答