使用LINQ对不情愿的正则表达式进行分组

时间:2014-01-07 03:05:03

标签: c# regex linq

我正在使用以下LINQ命令使用不情愿的正则表达式从字符串中提取括号分隔参数列表:

var result = Regex.Matches("foo[a][b][cccc]bar", @"(\[.+?])")
    .Cast<Match>()
    .Select(match => match.ToString())
    .ToArray();

按预期返回以下字符串数组:

- result    {string[3]} string[]
    [0] "[a]"   string
    [1] "[b]"   string
    [2] "[cccc]"    string

有没有办法修改正则表达式本身,以便括号不包含在输出中?我尝试将表达式的。+部分放在命名组中,但它打破了匹配。显然,我可以通过另一个正则表达式运行每个结果来删除括号,但我想知道是否有更清洁/更好的方法来执行此操作。

1 个答案:

答案 0 :(得分:2)

是的,你可以使用look-behind和look-ahead断言:

(?<=\[)(.+?)(?=])

代码是:

var result = Regex.Matches("foo[a][b][cccc]bar", @"(?<=\[).+?(?=])")
    .Cast<Match>()
    .Select(m => m.ToString())
    .ToArray();

另请注意,您不需要在正则表达式中对括号()进行分组,因为您没有尝试捕获任何组。