Arhn - архитектура программирования

Как использовать регулярное выражение для извлечения адреса с необязательным street2

Мне нужно извлечь имя, улицу1, улицу2, город, штат, почтовый индекс

У меня есть данные в этой форме

JOHN m SMITH [1111 WEST OAK ROAD, SUITE 101, CITY, ST 55555]
GEORGE m JONES [222 MAIN STREET, CITY, ST 55555]

Мои результаты для ДЖОНА должны быть

name="JOHN m SMITH"
street1="1111 WEST OAK ROAD"
street2="SUITE 101"
city = "CITY"
state = "ST"
zip = "55555"

Это работает с данными GEORGE

            Regex r = new Regex(@"^(?<name>.*)\[(?<street>.*)[,]\s(?<city>.*)[,]\s(?<state>.*)\s(?<zip>\d{5})\]$");
            var match = r.Match(fullNameAndAddress);
            name = match.Groups["name"].Value;
            street = match.Groups["street"].Value;
            city = match.Groups["city"].Value;
            state = match.Groups["state"].Value;
            zip = match.Groups["zip"].Value;

Как добавить необязательную улицу2?

Я хочу 1 и только 1 "уличную" группу. Я думал, что это должно быть так: (....){1}?

улица2 необязательно ноль или 1 раз. Я думал, что он должен иметь это (...)?

но это не работает с данными ДЖОНА, и улица1, и улица2 входят в группу улиц:

^(?<name>.*)\[((?<street>.*)[,]\s){1}?((?<street2>.*)[,]\s)?(?<city>.*)[,]\s(?<state>.*)\s(?<zip>\d{5})\]$
20.09.2012

Ответы:


1

Не могли бы вы уточнить, что вы хотите хранить на улице?

Вы хотите, чтобы John's выглядел как «1111 WEST OAK ROAD, SUITE 101»?

Или вы хотите вставить его в какую-то переменную, которую не будете использовать, чтобы улица выглядела как «1111 WEST OAK ROAD»?

Изменить: с разъяснением, проверьте эту ссылку

http://rubular.com/r/S4HaTMVFZl

Я считаю, что здесь происходит то, что * жадный, захватывая столько, сколько может, прежде чем найти окончательное вхождение [,]\s

Добавление ? после того, как .* делает его ленивым, захватывая как можно меньше информации.

Измененное регулярное выражение выглядит так

^(?<name>.*)\[((?<street>.*?)[,]\s)((?<street2>.*)[,]\s)?(?<city>.*)[,]\s(?<state>.{2})\s(?<zip>\d{5})\]$

Вы заметите, что я изменил регулярное выражение для состояния с .* на .{2}, заставив использовать двухсимвольное состояние. Не стесняйтесь вернуть это, если вы этого не хотите :)

20.09.2012
  • Уточненный вопрос (надеюсь) я хочу SUITE 101 в переменной, к которой я могу получить доступ. 20.09.2012
  • Состояние символа {2} хорошее. Спасибо за объяснение ленивой загрузки. 20.09.2012

  • 2

    Я внес пару изменений в ваше регулярное выражение на rubular.com, и, похоже, оно работает с обеими строками примера:

    ^(?<name>.+)\s\[(?<street>[^,]+),\s((?<street2>[^,]+),\s+)?(?<city>[^,]+),\s(?<state>.+)\s(?<zip>\d{5})\]$
    
    street2 = match.Groups["street2"].Value;
    

    Один трюк, который я изучил с регулярными выражениями, заключается в использовании отрицания разделителя (например, [^,]* для всего, кроме запятой) вместо .*, поэтому невозможно захватить несколько полей одним выражением. Кроме того, в большинстве групп полезен оператор +, для которого требуется хотя бы одно совпадение.

    Кроме того, дополнительная запятая присутствует только в том случае, если в адресе есть компонент street2, что указывает на то, что запятая должна находиться в той же группе захвата, что и часть street2. Я добавил дополнительную группу захвата вокруг группы захвата street2, чтобы учесть это. Вы можете сделать группы незахватывающими на большинстве языков, но это не кажется необходимым.

    20.09.2012
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..