Регулярное выражение с большим количеством "или" - PullRequest
1 голос
/ 27 февраля 2012

Написание некоторого регулярного выражения для обработки адресов улиц.Однако я не уверен, является ли регулярное выражение правильным способом решения этой проблемы.

У меня есть уличный адрес, который выглядит следующим образом:

7829 Hollywood Ave

Я хотел бы написать регулярное выражение, которое говорит это (псевдо-код):

match a NUMBER then ONE OR MORE WORDS then a STREET TYPE

В javascript это регулярное выражение будет выглядеть примерно так:

/^\d+\s+.*(\sAve|\sStreet|\sSt.|..800 MORE ABBREVIATIONS!...)/ig

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

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

match a NUMBER then **A STREET NAME IN A DATABASE** then a STREET TYPE

Любой вклад приветствуется!

Ответы [ 3 ]

3 голосов
/ 27 февраля 2012

Если бы все адреса были такими простыми, как <number> <name> <type>, жизнь была бы очень простой - но это не так, поэтому это не так.

Адреса улиц слишком сложны для одного регулярного выражения, например 5/45 Восток 51-я улица или 215-217 Лонг Айленд Уэй. Вам нужно либо: разбить его и проанализировать детали, либо дать пользователю ввести адрес в определенных полях, либо просто принять то, что они вам дают.

1 голос
/ 27 февраля 2012

Использовать группы захвата. Я не уверен насчет JS, но в Java вы делаете:

/ ^ (\ d +) \ s + (. *) (\ W +) / ig

И вы можете получить содержимое групп в скобках (с помощью Matcher.getGroup (int)).

Позже вы сопоставите эти строки с вашей базой данных.

Во всяком случае .... почему? Возможно, типы улиц оправдывают это, но ограничение названий улиц только добавляет больше работы для вас и создает неудобства для пользователя (если название улицы не совсем такое, как в вашей базе данных, или если ваша база данных недостаточно обновлена ). Хотите, чтобы пользователь поставил свое направление? если пользователь не хочет, он может предоставить поддельные данные. Пользователь хочет, чтобы у вас было его направление? Тогда вы можете верить, что пользователь сможет написать это правильно ...

1 голос
/ 27 февраля 2012

Вы можете зафиксировать тип улицы, а затем проверить, находится ли захваченный контент в списке типов улиц.

Регулярное выражение станет:

/^\d+\s+.*\s+(.*)

или

/^\d+\s+.*\s+(?P<streettype>.*)

...