当使用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的工作方式,但这是可以实现的吗?如果是,如何实现?)
您可以使用反向引用:
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比大多数更灵活。