我已经阅读了多个有关如何使用平衡组的资料,但所有示例仅匹配最外层的匹配项。是否可以用一个正则表达式来匹配与该模式匹配的所有子字符串? (平台为.NET 4.0)
这是我想要的示例: 输入:
a + ((b + (c + d)) + (e + f))
所需的匹配(“教科书”正则表达式仅生成第一个匹配):
- ((b + (c + d)) + (e + f))
- (b + (c + d))
- (c + d)
- (e + f)
最佳答案
这可以通过正则表达式在前瞻的帮助下完成。但这并不是最佳选择,因为它会为每场比赛“重新解析”一些括号组。使用真正的解析器只会读取/解析字符串一次,并且效率更高。
示例(ideone):
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
var re = @"(?x) # ignore spaces and comments
(?= # lookahead (zero width)
(
\( # first (
(?:
(?<open> \( )* # open++
[^()]+
(?<-open> \) )* # open--
)+
\) # last )
(?(open)(?!)) # fail if unblanaced: open > 0
)
)
\( # eat a (, to advance the match a char";
var str = "a + ((b + (c + d)) + (e + f)) + (x + ((y) + (z)) + x)";
var m = Regex.Matches(str, re);
Console.WriteLine("Matched: ");
foreach (Match i in m)
Console.WriteLine(i.Groups[1]);
}
}
输出:
Matched:
((b + (c + d)) + (e + f))
(b + (c + d))
(c + d)
(e + f)
(x + ((y) + (z)) + x)
((y) + (z))
(y)
(z)
关于c# - 带平衡组的正则表达式不仅匹配最外面的匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15752778/