Ваш пример вывода сбивает с толку.Первая строка подразумевает, что вы хотите разбить уличный адрес на отдельные его компоненты, но в остальных строках все они сгруппированы вместе.Я ожидаю, что желаемый результат будет либо:
"123 SUNNYSIDE AVENUE", "BROOKLYN"
"59 MAIDEN LANE", "MANHATTAN"
"59 MAIDEN LANE", "MANHATTAN"
"39-076 46 STREET", "SUNNYSIDE"
"39-076 46 STREET", "SUNNYSIDE"
"59 MAIDEN LANE", "MANHATTAN"
... или:
"123", "SUNNYSIDE", "AVENUE", "BROOKLYN"
"59", "MAIDEN", "LANE", "MANHATTAN"
"59", "MAIDEN", "LANE", "MANHATTAN"
"39-076", "46", "STREET", "SUNNYSIDE"
"39-076", "46", "STREET", "SUNNYSIDE"
"59", "MAIDEN", "LANE", "MANHATTAN"
В любом случае, я бы начал с сопоставления его с этим регулярным выражением:
^(\S+(?:\s+\S+)*)\s+(MANHATTAN|BROOKLYN|SUNNYSIDE)
Первая группа жадная, поэтому она будет первоначально потреблять все, кроме последнего слова адресной строки.Если последнее слово не является названием города (то есть оно не соответствует группе (MANHATTAN|BROOKLYN|SUNNYSIDE)
), первая группа «сдает» по одному слову за раз, пока вторая группа не выполнит сопоставление .
Предполагая, что строка на самом деле содержит название города и имя включено в подвыражение второй группы, оно будет записано в группе # 2.Группа № 1 будет содержать полный адрес улицы;если вы хотите разбить его, как показано выше, вы можете разбить его на пробелы.
РЕДАКТИРОВАТЬ: Вот пример кода для демонстрации.Обратите особое внимание на использование find()
вместо matches()
.Поведение Java matches()
метода удивляет многих, и пришло в голову, что это может быть частью проблемы здесь.Вкратце, find()
- это то, почему я должен был добавить ^
начало регулярного выражения, и почему я не должен был добавить .*
в конец.;)
String[] ss = {
"123 SUNNYSIDE AVENUE BROOKLYN",
"59 MAIDEN LANE MANHATTAN",
"59 MAIDEN LANE MANHATTAN 10038",
"39-076 46 STREET SUNNYSIDE",
"39-076 46 STREET SUNNYSIDE 11104",
"59 MAIDEN LANE MANHATTAN NY USA"
};
Pattern p = Pattern.compile("^(\\S+(?:\\s+\\S+)*)\\s+(MANHATTAN|BROOKLYN|SUNNYSIDE)");
Matcher m = p.matcher("");
for (String s : ss)
{
if (m.reset(s).find())
{
System.out.printf("%naddr: '%s'%ncity: '%s'%n", m.group(1), m.group(2));
}
}
вывод:
addr: '123 SUNNYSIDE AVENUE'
city: 'BROOKLYN'
addr: '59 MAIDEN LANE'
city: 'MANHATTAN'
addr: '59 MAIDEN LANE'
city: 'MANHATTAN'
addr: '39-076 46 STREET'
city: 'SUNNYSIDE'
addr: '39-076 46 STREET'
city: 'SUNNYSIDE'
addr: '59 MAIDEN LANE'
city: 'MANHATTAN'