Как написать регулярное выражение с сопоставлением группы? - PullRequest
1 голос
/ 21 октября 2009

Вот источник данных, строки хранятся в текстовом файле:

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;                
    }

Строки не совпадают. Что я делаю не так?

Ответы [ 3 ]

2 голосов
/ 21 октября 2009

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

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

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

0 голосов
/ 21 октября 2009

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

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

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

0 голосов
/ 21 октября 2009

попробуйте

string pattern = "servers[i]=[\"(?<name>.*)\", (.*), (?<location>.*)];$";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...