2016-01-29 167 views
0

我有这个文本,我想从它得到2个匹配,但问题是我总是只得到1匹配。这是在C#示例代码正则表达式多个匹配

string formattedTag = "{Tag 1}::[FORMAT] asdfa {Tag 2}::[FORMAT]"; 
var tagMatches = Regex.Matches(formattedTag, @"(\{.+\}\:\:\[.+\])"); 

我期待到这里的两场比赛“{标签1} :: [格式]”和“{标签2} :: [格式]” 但结果这段代码是变量formattedTag的实际值。 它必须是来自正则表达式模式的东西,所以有人可以帮我弄明白吗?

我会感谢每一个帮助。提前致谢!

+1

是非贪婪,'@ “(\ \ {+ \。?}:\:[+ \?] \)”' –

+0

1您响应阿维纳什。当程序或编程语言允许时,使用非贪婪的运算符可能会很好。我通常不会使用它们,因为某些程序(如sed或grep)不允许使用它们。 –

+0

谢谢Avinash!这一个也适用。并注意到这个非贪婪的运营商 – Kymel15

回答

1

您需要使用下面的正则表达式:

(\{[^}]+\}\:\:\[[^]]+\]) 

你想要的字符串您的括号部分内匹配除了右括号的任何字符,否则整个字符串匹配,因为正则表达式是贪婪尝试检索最长的匹配。

+0

哦,我的..它的作品就像一个魅力。非常感谢戴夫! – Kymel15

+0

'{[^}] +} :: \ [[^]] +]'就够了。 –

0
string formattedTag = "{tag 1}::[admin] adfaf{tag 2}::[test.user]"; 
    var tagMatches = Regex.Matches(formattedTag, @"\{(\w+\s*\d{1,2})\}::\[(.*?)\]"); 
    foreach(Match item in tagMatches)[enter image description here][1]{ 
     Console.WriteLine(item.Groups[0]); 
     Console.WriteLine(item.Groups[1] + "=" + item.Groups[2]); 
    }