Регулярное выражение, которое придает большее значение некоторым типам - PullRequest
1 голос
/ 08 января 2020

Я пытаюсь сопоставить город, штат, почтовый индекс, но все они необязательны. Правило: если я найду 5 цифр, это почтовый индекс. Если я найду 2 буквы, это состояние. Остальное - город.

Разделителями могут быть пробелы, запятые, и уродливые периоды могут быть на пути.

Я придумал это:

^(?<CITY>[A-Z ]*)[ ,]+(?<STATE>[A-Z]{2})?\.?([ ,]+(?<ZIP>[0-9]{5}))?$
SEATTLE  WA 98103
WALNUT CREEK CA 98103
WALNUT CREEK, CA, 98103
WALNUT CREEK, CA
WALNUT CREEK, 98103
SEATTLE, WA. 98103
SEATTLE  WA, 98103
98103
WA 98103
SEATTLE

Но это не ставит акценты на правила ZIP и State. Так что мне не хватает пары сценариев ios. Последние 4 не работают.

Как я могу применить это правило? Некоторые атомы c? Некоторые смотрят в будущее?

Ответы [ 2 ]

2 голосов
/ 08 января 2020

Вы можете использовать

^(?<CITY>[A-Z ]*?)(?:[ ,]*\b(?<STATE>[A-Z]{2})\.?)?(?:[ ,]*\b(?<ZIP>[0-9]{5}))?$

Или, если часть CITY может содержать какие-либо символы, заменить [A-Z ]*? на .*?. Замените буквенное пространство на \s, чтобы соответствовать любым символам пробела.

Подробности

  • ^ - начало строки
  • (?<CITY>[A-Z ]*?) - группа CITY: любые 0+ прописные буквы или пробелы ASCII, как можно меньше
  • (?:[ ,]*\b(?<STATE>[A-Z]{2})\.?)? - необязательный шаблон, соответствующий
    • [ ,]* - ноль или более пробелов или запятых
    • \b - граница слова
    • (?<STATE>[A-Z]{2}) - группа STATE: две заглавные буквы ASCII
    • \.? - необязательная точка
  • (?:[ ,]*\b(?<ZIP>[0-9]{5}))? - необязательное сопоставление с образцом:
    • [ ,]* - ноль или более пробелов или запятых
    • \b - граница слова
    • (?<ZIP>[0-9]{5}) - ZIP-группа: пять цифр
  • $ - конец строки.

См. Демонстрационную версию regex . Выход:

enter image description here

0 голосов
/ 08 января 2020

Я просто сделал их опциональными разделителями

^(?<CITY>[A-Z ]*)?([ ,]+)?(?<STATE>[A-Z]{2})?\.?(([ ,]+)?(?<ZIP>[0-9]{5}))?$

См. Это регулярное выражение101

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...