这与此处的问题非常相似:How do I extract text that lies between parentheses (round brackets)?我看到了这个正则表达式代码:
var matches = Regex.Matches("User name [[sales]] and [[anotherthing]]", @"\[\[([^)]*)\]\]");
但这似乎不适用于多字符分隔符?这可能不是正确的方法,但我确信我不是第一个尝试这个的人,我在这里画一个空白 - 任何人?
答案 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 demo。 RegexOptions.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)
在指定的输入字符串中搜索指定正则表达式的所有出现次数。
示例代码:
var matches = Regex.Matches("User name (sales) and (anotherthing)", @"\(([^)]*)\)")
.Cast<Match>()
.Select(p => p.Groups[1].Value)
.ToList();