Почему это регулярное выражение Java работает непоследовательно для удаления номеров улиц из адресов улиц США? - PullRequest
3 голосов
/ 13 сентября 2010

Я пытаюсь убрать номер улицы с почтового адреса.

У меня есть регулярное выражение в Java:

address.replace("^\\s*[0-9]+\\s+","");

Работает по этому адресу:

301 West 23rd Street

делает это:

West 23rd Street

Но когда я применяю его к этому адресу, адрес остается неизменным:

70-50 69th Place

Вместо этого должно быть:

69th Place

Есть идеи?

Ответы [ 4 ]

4 голосов
/ 13 сентября 2010

Ваше регулярное выражение не соответствует этой строке. Вот объяснение регулярного выражения

^      Start of string. Matches successfully.
\\s*   Zero or more whitespace. Matches the empty string.
[0-9]+ One or more digits. Matches "70".
\\s+   One or more whitespace. Fails to match.

Символ после "70" является дефисом, а дефис не является пробельным символом, поэтому совпадение не выполняется и замена не производится. Чтобы исправить это, вы можете поставить дефис в класс персонажа:

address = address.replace("^\\s*[0-9-]+\\s+", "");

Когда дефис находится в классе символов, он имеет особое значение (диапазон символов), за исключением двух случаев:

  • когда он находится в начале или в конце класса символов
  • когда он экранируется с помощью обратной косой черты (но учтите, что в строковом литерале Java требуется две обратной косой черты).
1 голос
/ 13 сентября 2010

Ваше регулярное выражение говорит, что нужно найти: пробел, цифры, пробел, а затем заменить их ничем.

У вашей "плохой" строки нет пробелов, цифр, пробелов, есть пробелы, цифры, тире.

Если вы хотите включить тире в номер улицы, попробуйте это: "^\\s*[0-9-]+\\s+"

1 голос
/ 13 сентября 2010

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

address.replace("^\\s*([0-9-]+\\s+)+","");
0 голосов
/ 09 февраля 2012

Если я могу сделать предложение ... просто используя регулярные выражения для манипулирования адресными данными, это похоже на использование одного отбойного молотка для вырезания горы.Рашмор с горы.На первый взгляд может показаться, что это работает, но впереди еще много работы.

Рассматривали ли вы адреса, введенные во всех формах и с компонентами в разных порядках, чем ожидалось?А как насчет названий улиц без "th" или "st" по номеру, и т. Д. И т. Д. (Здесь слишком много дел, чтобы перечислять их).

Я работаю на SmartyStreets , где наша экспертизастандартизация и проверка адресов.Для вашей задачи вы можете подключиться к сертифицированному CASS API-интерфейсу, чтобы вернуть адрес, стандартизированный и разбитый на части (разбитый на части), так что вы можете оставить только те части, которые хотите, и быть точными .Я предлагаю вам взглянуть на что-то вроде LiveAddress , которое предоставляет это бесплатно.Проведите небольшое исследование самостоятельно, и я буду рад помочь ответить на другие ваши вопросы, связанные с адресами.

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