2009-10-21 2 views
1

Вот источник данных, строки, сохраненные в текстовом файле:Как написать регулярное выражение с групповым сопоставлением?

servers[i]=["name1", type1, location3]; 
servers[i]=["name2", type2, location3]; 
servers[i]=["name3", type1, location7]; 

Вот мой код:

string servers = File.ReadAllText("servers.txt"); 
    string pattern = "^servers[i]=[\"(?<name>.*)\", (.*), (?<location>.*)];$"; 

    Regex reg = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Multiline); 
    Match m; 

    for (m = reg.Match(servers); m.Success; m = m.NextMatch()) { 
     string name = m.Groups["name"].Value; 
     string location = m.Groups["location"].Value;     
    } 

Нет линий не соответствие. Что я делаю не так?

ответ

0

Я не знаю, если C# регулярные выражения являются такими же, как Perl, но если это так, то вы, вероятно, хотите, чтобы избежать [ и ] символов. Также есть дополнительные символы. Попробуйте это:

string pattern = "^servers\[i\]=\[\"(?<name>.*)\", (.*), (?<location>.*)\];$"; 

Edited добавить: После того, как интересно, почему мой ответ был downvoted, а затем, глядя на ответ Вэл, я понял, что «лишние символы» были там по причине. Это то, что perl вызывает «названные буферы захвата», которые я никогда не использовал, но исходный фрагмент кода делает. Я обновил свой ответ, чтобы включить их.

+0

Это было его частью, соответствовала одной строке после этих изменений. Удаление^и $ позаботилось об остальном. Благодаря! – 2009-10-21 16:57:39

0

попробовать это

string pattern = "servers[i]=[\"(?<name>.*)\", (.*), (?<location>.*)];$"; 
2

Если вам все равно, кроме имени сервера и местоположения, вам не нужно указывать остальную часть ввода в вашем регулярном выражении. Это позволяет избежать необходимости избегать скобок, как правильно указывает Грэм. Попробуйте что-то вроде:

string pattern = "\"(?<name>.+)\".+\s(?<location>[^ ]+)];$" 

Это

\"   = quote mark, 
(?<name>  = start capture group 'name', 
.+   = match one or more chars (could use \w+ here for 1+ word chars) 
)   = end the capture group 
\"   = ending quote mark 
.+\s   = one or more chars, ending with a space 
(?<location> = start capture group 'location', 
[^ ]+  = one or more non-space chars 
)   = end the capture group 
];$   = immediately followed by ]; and end of string 

Я проверил это, используя данные образцы в Rad Software, бесплатно Regex Designer, который использует .NET регулярок двигатель.

Смежные вопросы