2010-08-23 3 views
1

У меня есть строка, такие какJava Строка Split Проблема

397 Walker Road         Wayne, PA 19087 

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

Я разделил строку на запятую и извлек состояние и почтовый индекс. Но я в недоумении о том, как убрать город оттуда, тем более, что пустое пространство непоследовательно.

ответ

3

Вы можете удалить лишние пробелы, используя регулярные выражения, как [\s]{2,}, что означает найти 2 или более последовательных пробелов. Это регулярное выражение не совпадает с одним пробелом. Затем вы можете заменить сопоставленные пробелы пробелом, а затем извлечь город (извлечение города - это другая проблема). Надеюсь это поможет.

+0

Да, это то, что мне было нужно – Pete

0

Проблема в том, что количество пробелов в базе данных несовместимо.
Если у разных полей данных есть по меньшей мере два пробела между ними, то это должно работать: s.split("\\s\\s+"). Каждая последовательность из двух или более пробельных символов будет рассматриваться как разделитель.
Но если данные могут быть в любом формате и нет никакой последовательности вообще, алгоритм не может помочь вам :)

3

Перед тем, как разбить строчку, нарисуйте пробелы, используя метод trim(). Затем разделите строку, используя регулярное выражение, которое ищет номер после Charecter.

+1

Просто хотел знать .. Почему нам нужно искать число после персонажа? Если пользователь собирается заполнить адрес, то, возможно, он может указать адрес в неправильном порядке также (по ошибке). – Shekhar

0

ОК, вот моя версия:

final String str = "397 Walker Road         Wayne, PA 19087"; 
final String[] tokens = str.split("(\\s*,\\s*|\\s{2,})"); 
System.out.println(Arrays.toString(tokens)); 

Выход:

[397 Walker Road, Wayne, PA, 19087] 

Это регулярное выражение ищет любой запятой (с дополнительным пробелом с обеих сторон) или, по крайней мере, два пробельных символов.

0

Я думаю, что Пит означает, что

397 Walker-роуд Wayne, PA 19087

Имеет "Wayne" в городе

Но

397 Walker Road Salt Lake City, PA 19087

Имеет «Солт-Лейк-Сити», как город

Предполагая, что вся секция перед запятой является фиксированной шириной, вы, вероятно, получите довольно хороший результат, используя ответ Шехара (слева и справа от последовательности из двух или более пробелов соответственно), используя [\ s] {2,}

В качестве альтернативы вам, возможно, придется выполнить матч на общих «уличных» окончаниях, таких как дорога, rd, street, st [hmm, st. = saint, это может быть проблемой], avenue, ave и т. д.

Извините, Пит, я думаю, нам нужно узнать больше о том, как выглядит ваш набор данных, и какие другие данные у вас есть (только для США ?, Список городов? и т. д.)

Roger

0

Там нет никакого способа сделать это во всех случаях. Вы можете написать алгоритм, который предполагает, что уличная часть всегда заканчивается чем-то вроде Road, Street, Lane и т. Д.