解析一个字符串,保持给定字符串之间的所有匹配(多字符分隔符)

时间:2016-01-22 22:57:12

标签: c# .net regex string

这与此处的问题非常相似:How do I extract text that lies between parentheses (round brackets)?我看到了这个正则表达式代码:

var matches = Regex.Matches("User name [[sales]] and [[anotherthing]]", @"\[\[([^)]*)\]\]");

但这似乎不适用于多字符分隔符?这可能不是正确的方法,但我确信我不是第一个尝试这个的人,我在这里画一个空白 - 任何人?

2 个答案:

答案 0 :(得分:3)

您的@"\[\[([^)]*)\]\]"模式与两个连续的[[匹配,后跟零个或多个字符而不是),然后是两个]]。这意味着,如果)内有[[...]],则不会匹配。

要处理多字符分隔的子字符串,您可以使用两件事:延迟点匹配或展开模式。

注意:要获得多个匹配,请在我的其他答案中使用Regex.Matches

<强> 1。懒点解决方案:

var s = "User name [[sales]] and [[anotherthing]]";
var matches = Regex.Matches(s, @"\[{2}(.*?)]{2}", RegexOptions.Singleline)
        .Cast<Match>()
        .Select(p => p.Groups[1].Value)
        .ToList();

请参阅regex demoRegexOptions.Singleline修饰符是.匹配换行符号所必需的。

<强> 2。展开的正则表达式解决方案:

var s = "User name [[sales]] and [[anotherthing]]";
var matches = Regex.Matches(s, @"\[{2}([^]]*(?:](?!])[^]]*)*)]{2}")
        .Cast<Match>()
        .Select(p => p.Groups[1].Value)
        .ToList();

使用这个,RegexOptions.Singleline不是必需的,而且效率更高,速度更快。

请参阅regex demo

答案 1 :(得分:2)

使用Regex.Matches

  

在指定的输入字符串中搜索指定正则表达式的所有出现次数

示例代码:

var matches = Regex.Matches("User name (sales) and (anotherthing)", @"\(([^)]*)\)")
            .Cast<Match>()
            .Select(p => p.Groups[1].Value)
            .ToList();