2016-01-22 19 views
-1

这是非常类似的问题在这里:How do I extract text that lies between parentheses (round brackets)?我看到这个表达式代码:解析字符串,给出的字符串之间保持所有比赛中(多字符分隔符)

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

但是,没有按” t似乎与多字符分隔符一起工作?这可能不是正确的方法,但我相信我不是第一个尝试这个,我在这里画空白 - 任何人?

+3

使用'Regex.Matches'。 –

+1

我投票结束这个问题作为离题,因为这可以解决检查intellisense建议或只是检查什么方法'正则表达式'对象支持MSDN。 –

+0

我更新了它,以更准确地解决我的问题。 Wiktor的回答原来的问题,但事实证明,没有为我的实际情况这么好。 – naspinski

回答

3

@"\[\[([^)]*)\]\]"模式匹配两个连续[[,接着以比其他)零个或多个字符,然后,接着有两个]]。这意味着,如果您在[[...]]内有),则不会有匹配。

要处理多字符分隔的子字符串,可以使用2种方法:延迟点匹配或展开的模式。

注意:获得多个匹配,使用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

哇,这是太棒了,谢谢你!我非常欣赏你的正则表达式的知识! – naspinski

2

使用Regex.Matches

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

样品的编号:

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

这很好,但...显然我的正则表达式是垃圾,因为它实际上是模式[[something]] - 并且subbing“\ [\ [”for“\(”似乎不是正确的? – naspinski

+0

如果您拥有多字符分隔符,单独否定的字符类也无济于事。我将发布另一种答案。 –