Шаблоны регулярных выражений Java - PullRequest
1 голос
/ 01 октября 2011

Мне нужна помощь в этом вопросе. Посмотрите на следующее регулярное выражение:

Pattern pattern = Pattern.compile("[A-Za-z]+(\\-[A-Za-z]+)");
Matcher matcher = pattern.matcher(s1);

Я хочу найти такие слова: "самодельный", "aaaa-bbb", а не "aaa - bbb", но не «Ааа - аа - ааа». В основном, я хочу следующее:

слово - дефис - слово.

Это работает для всего, кроме того, что этот шаблон пройдет: "ааа - ааа - ааа" и не должен. Какое регулярное выражение будет работать для этого шаблона?

Ответы [ 2 ]

5 голосов
/ 01 октября 2011

Может удалить обратную косую черту из вашего выражения:

"[A-Za-z]+-[A-Za-z]+"

Тогда должен работать следующий код

Pattern pattern = Pattern.compile("[A-Za-z]+-[A-Za-z]+");
Matcher matcher = pattern.matcher("aaa-bbb");
match = matcher.matches();

Обратите внимание, что вы можете использовать Matcher.matches()вместо Matcher.find() для проверки совпадения всей строки.

Если вместо этого вы хотите заглянуть внутрь строки, используя Matcher.find(), вы можете использовать выражение

"(^|\\s)[A-Za-z]+-[A-Za-z]+(\\s|$)"

, нообратите внимание, что тогда будут найдены только слова, разделенные пробелами (т.е. нет слов вроде aaa-bbb.).Чтобы запечатлеть также этот случай, вы можете использовать lookbehinds и lookaheads:

"(?<![A-Za-z-])[A-Za-z]+-[A-Za-z]+(?![A-Za-z-])"

, который будет читать

(?<![A-Za-z-])        // before the match there must not be and A-Z or -
[A-Za-z]+             // the match itself consists of one or more A-Z
-                     // followed by a -
[A-Za-z]+             // followed by one or more A-Z
(?![A-Za-z-])         // but afterwards not by any A-Z or -

Пример:

Pattern pattern = Pattern.compile("(?<![A-Za-z-])[A-Za-z]+-[A-Za-z]+(?![A-Za-z-])");
Matcher matcher = pattern.matcher("It is home-made.");
if (matcher.find()) {
    System.out.println(matcher.group());    // => home-made
}
0 голосов
/ 01 октября 2011

На самом деле я не могу воспроизвести проблему, упомянутую с вашим выражением, если я использую отдельные слова в строке. Как выяснилось из обсуждения в комментариях, строка String содержит целое предложение, которое сначала должно быть разбито на слова, а затем сопоставлено или нет.

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegExp {

        private static void match(String s) {
                Pattern pattern = Pattern.compile("[A-Za-z]+(\\-[A-Za-z]+)");
                Matcher matcher = pattern.matcher(s);
                if (matcher.matches()) {
                        System.out.println("'" + s + "' match");
                } else {
                        System.out.println("'" + s + "' doesn't match");
                }
        }

        /**
        * @param args
        */
        public static void main(String[] args) {
                match(" -home-made");
                match("home-made");
                match("aaaa-bbb");
                match("aaa - bbb");
                match("aaa--aa--aaa");
                match("home--home-home");
        }

}

Вывод:

' -home-made' doesn't match
'home-made' match
'aaaa-bbb' match
'aaa - bbb' doesn't match
'aaa--aa--aaa' doesn't match
'home--home-home' doesn't match
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...