Регулярное выражение, дающее неожиданные совпадения - PullRequest
3 голосов
/ 12 января 2012

Я использовал http://www.regexplanet.com/advanced/java/index.html для проверки написанного мной регулярного выражения.

Регулярное выражение: \ A [\ d + (- \ d +) {0,1}\ | \ d + \ | \ d + \ | [Ю.Н.] {1}] ([\ d + (- \ d +) {0,1} \ | \ d + \ | \ d + \ | [Ю.Н.] {1}])* \ z

Я пытаюсь сопоставить строки вида '[30-41 | 2 | 21 | Y]' ИЛИ ​​[15-23 | 45 | 12 | Y], [15 | 42| 6 | Y] 'etc

Регулярное выражение, кажется, отлично работает при тестировании на этом сайте, однако, когда я использую его в своем собственном Java-коде (см. Ниже), оно дает мне неожиданные совпадения (я вставил консольвывод ниже кода).Кто-нибудь знает, что я делаю здесь не так?

РЕДАКТИРОВАТЬ: Как указал Stema, у меня была строка ввода и шаблон в неправильном порядке при создании Pattern и Matcher.Я поменял эти раунды сейчас, но теперь получаю «совпадение не найдено».

public static void testRegex(String inputString){

    String regex = "\\A\\[\\d+(\\-\\d+){0,1}\\|\\d+\\|\\d+\\|[YN]{1}\\](,\\[\\d+(\\-\\d+){0,1}\\|\\d+\\|\\d+\\|[YN]{1}\\])*\\z";

    Pattern pattern = Pattern.compile(inputString);

    Matcher matcher = pattern.matcher(regex);

    boolean found = false;

    while(matcher.find()){
        System.out.println("Found at :");
        System.out.println("start - " + matcher.start());
        System.out.println(", end - " + matcher.end() + ". ");
        found = true;
    }

    if(!found){
        System.out.println("no match found");
    }
}


public static void main(String[] args){
    testRegex("[61|12|6]");
}    

Вывод на консоль, который я получаю:

Найдено в: начало - 17, конец - 18. Найдено в: начало - 20, конец - 21. Найдено в: начало -25, конец - 26. Найдено в: начало - 30, конец - 31. Найдено в: начало - 36, конец - 37. Найдено в: начало - 57, конец - 58. Найдено в: начало - 60, конец - 61.Найдено в: начало - 65, конец - 66. Найдено в: начало - 70, конец - 71. Найдено в: начало - 76, конец - 77.

1 Ответ

3 голосов
/ 12 января 2012

Ваш код неверен

Pattern pattern = Pattern.compile(inputString);
Matcher matcher = pattern.matcher(regex);

вам нужно скомпилировать шаблон , а не входную строку, это должно работать лучше:

Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(inputString);

С вашим «шаблоном» [61|12|6] вы находите «1» и «|» в регулярном выражении.

Обновление

Вы не охватываете шаблон входных строк ([61|12|6]) в своем регулярном выражении, потому что четвертая часть, в которой вы проверяете \\|[YN], не является обязательной. Попробуйте это:

\\A\\[\\d+(\\-\\d+)?\\|\\d+\\|\\d+(?:\\|[YN])?\\](,\\[\\d+(\\-\\d+)?\\|\\d+\\|\\d+(?:\\|[YN])?\\])*\\z

См. здесь на Regexr

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...