Как заставить регулярное выражение находить улицу / дорогу с помощью Java?

#java #regex #pattern-matching

#java #регулярное выражение #сопоставление с образцом

Вопрос:

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

Затем кто-то решил пойти на главную улицу, чтобы выпить

Термин «главная улица» будет соответствовать. Итак, это предшествующее слово и слово «улица», чтобы получить название улицы. Я пробовал что-то вроде этого:

 Pattern.compile("(\w \s*(road|street|square|rd|st|sq)\W )");
  

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

Любая помощь / предложения будут высоко оценены. Спасибо!

Комментарии:

1. (w (road|street|square|rd|st|sq)) … разве это не работает?

Ответ №1:

Убедитесь, что вы используете Matcher.find и нет Matcher.matches .

Это отлично работает на моей машине:

 String s = "Then someone decided to go to the high street for a drink";

Pattern p = Pattern.compile("(\w \s*(road|street|square|rd|st|sq)\W )");

Matcher m = p.matcher(s);

System.out.println(m.find());   // prints true
System.out.println(m.group());  // prints "high street"
  

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

 w s*(road|street|square|rd|st|sq)W
  

или

 w s*(r(oa)?d|st(reet)?|sq(uare)?)W
  

(выдает тот же результат, что и выше)

Комментарии:

1. @см.: Захват групп ( download.oracle.com/javase/tutorial/essential/regex/groups.html ) для получения более подробной информации

2. @Ralph, на самом деле никаких групп захвата не задействовано… m.group() возвращает всю подстроку, соответствующую выражению (даже если у вас ее нет (...) .)

3. Упоминание групп захвата всегда является полезным советом! это правда: D

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