#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. Большое спасибо, похоже, это был метод, который я использовал, а не регулярное выражение, в котором я был виноват.