Как работает следующий шаблон регулярных выражений? - PullRequest
2 голосов
/ 18 марта 2010

Я ужасен с регулярным выражением, но я пытаюсь выяснить, как работает функция импорта, и я наткнулся на этот шаблон регулярного выражения. Может быть, один из вас может помочь мне понять, как это работает.

string pattern = @"^""(?<code>.*)"",""(?<last_name>.*)"",""(?<first_name>.*)"",""(?<address>.*)"",""(?<city>.*)"",""(?<state>.*)"",""(?<zip>.*)""$";
Regex re = new Regex(pattern);
Match ma = re.Match(_sReader.ReadLine().Trim());

Спасибо

Ответы [ 3 ]

2 голосов
/ 18 марта 2010

Похоже, что он пытается разбить строку, разделенную запятой (с полями, заключенными в кавычки) на отдельные поля с именованными группами. Синтаксис (?<name>...) захватывает поля в именованные группы. ^ указывает, что совпадение должно начинаться в начале строки, а $ - конец привязки строки. .* в каждой группе говорит, что нужно захватить все (любой символ, ноль или более раз), которые встречаются между двойными кавычками.

По сути, он должен анализировать входную строку CSV в массив строк, на которые вы можете ссылаться по имени группы. Вы можете ссылаться на захваченные группы, используя ma.Groups[x], где x - целое число, или вы можете использовать имя группы. Например, ma.Groups["code"].

1 голос
/ 18 марта 2010

То, как я это читаю. Это анализатор записей плоских файлов.
В этом случае это CSV с кавычками.

И это делает вас словарь полей. Чтобы вам было проще работать с записью csv.

Вместо того, чтобы знать, что четвертое поле - это адрес в коде, после этого вы просто ссылаетесь на группы ["address"] и получаете 4-е поле.

Есть более простые и общие способы сделать это. Это регулярное выражение будет очень хрупким с течением времени, если hte-файл плохо разграничен или если в конце hte-файла отсутствует кавычка.

0 голосов
/ 18 марта 2010

Разделяй и властвуй ! лучше всего работает с regex.

    string pattern = @"^""(?<last_name>.*)"",""(?<first_name>.*)""";

    Regex re = new Regex(pattern);

    //  INPUT: make sure you input it with " double inverted commas
    //  "("bond","james")"
    Match mm = re.Match(Console.ReadLine().Trim()); 

    Console.WriteLine("Last Name:"+mm.Groups["last_name"]);
    Console.WriteLine("First Name:"+mm.Groups["first_name"]);

ВЫВОД:

 Last Name:("bond
 First Name:james")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...