2012-07-09 105 views
1

我试图下面的字符串与正则表达式正则表达式来解析[A] [B]到A和B

[property1=text1][property2=text2] 

并分离成一个单独的行所期望的结果应该是

property1=text1 
property2=text2 

这里是我的代码

string[] attrs = Regex.Split(attr_str, @"\[(.+)\]"); 

结果不正确,我可能做错事

enter image description here

UPDATE:采取建议的答复后。现在它显示的空间与空字符串

enter image description here

+0

我们怎样才能让它只匹配[XXX]。字符串中没有[]或[],为什么它匹配那些? – codingbiz 2012-07-09 16:23:38

回答

5

.+是一个贪婪的匹配,所以它吸引尽可能多的。

选其一

\[([^]]+)\] 

\[(.+?)\] 

在第一种情况下,匹配]是不允许的,所以 “尽可能” 变短。第二个使用非贪婪的匹配。

+0

我尝试了两种方法,但它匹配空格和空字符串。我们怎么能告诉它只匹配[xxx]。在字符串中没有[]或[],为什么它匹配那些 – codingbiz 2012-07-09 16:23:04

+0

@tcoder:那是因为你正在使用'Regex.Split'。分隔符之间的东西确实是一个空字符串。改用'Match'。 – 2012-07-09 16:40:59

+0

这是我的不好。我想知道为什么我第一次工作。我只是交叉检查它,它使用'.Matches'而不是'.Split'。谢谢 – codingbiz 2012-07-09 16:48:03

4

你的小点也抓住了大括号。您需要排除大括号:

\[([^]]+)\] 

[^]]匹配除了大括号外的任何字符。

2

尝试添加 '懒' 说明:

Regex.Split(attr_str, @"\[(.+?)\]"); 
2

尝试:

var s = "[property1=text1][property2=text2]"; 
var matches = Regex.Matches(s, @"\[(.+?)\]") 
    .Cast<Match>() 
    .Select(m => m.Groups[1].Value); 
相关问题