Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Java Regex - BUG?


Автор: nevermind 8.2.2010, 17:09
Добрый день! Не совсем понимаю, почему на экран выдается false. Вроде регулярное выражение правильное, или я ошибаюсь.
Спасибо за помощь 
Код

package test;

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

public class Quatsch
{

    public static void main(String[] args)
    {
        Pattern p = Pattern.compile("((b)?cc|x)");
        Matcher m = p.matcher("x");
        System.out.println(m.find()); // --> false
    }
}

Автор: nevermind 8.2.2010, 17:32
Написал небольшой юнит-тест. Pattern a und c работают, c проваливается, причем b и c отличаются только одной "c"

Код

package javaregex;

import static org.junit.Assert.assertTrue;

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

import org.junit.Test;

public class RegexTest {
    Pattern a = Pattern.compile("(a|(b)?cc|x)");

    /***********************************************
     * Pattern b fails to match the String "x"
     */
    Pattern b = Pattern.compile("((b)?cc|x)");

    Pattern c = Pattern.compile("((b)?c|x)");

    String s = "x";

    @Test
    public void testPatternA() throws Exception {
    Matcher match = a.matcher(s);
    assertTrue(match.find());
    }

    @Test
    public void testPatternB() throws Exception {
    Matcher match = b.matcher(s);
    assertTrue(match.find());
    }

    @Test
    public void testPatternC() throws Exception {
    Matcher match = c.matcher(s);
    assertTrue(match.find());
    }
}

Автор: jk1 8.2.2010, 21:18
Если требуется указать перечень вариантов внутри более сложного регулярного выражения, то его нужно заключить в группу. То есть, если вы хотите организовать внутри выражения перебор "cc или x", пишите так:
Код

Pattern a = Pattern.compile("((b)?(cc|x))");



Автор: nevermind 10.2.2010, 11:45
Спасибо за ответ, но меня больше интересует не обход проблемы, а причина, почему она возникла? smile

Автор: aleksandy 10.2.2010, 12:40
А если сделать вот так? ;)
Код
Pattern a = Pattern.compile("((b)?x|cc)")

Чтобы не возникало таких вопросов рекомендую http://www.google.ru/search?q=%D0%A4%D1%80%D0%B8%D0%B4%D0%BB+%D0%A0%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%B5+%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ru:official&client=firefox. Много вопросов отпадет.

Автор: nevermind 10.2.2010, 14:27
Цитата(aleksandy @ 10.2.2010,  11:40)
А если сделать вот так? ;)
Код
Pattern a = Pattern.compile("((b)?x|cc)")

Чтобы не возникало таких вопросов рекомендую http://www.google.ru/search?q=%D0%A4%D1%80%D0%B8%D0%B4%D0%BB+%D0%A0%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%B5+%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ru:official&client=firefox. Много вопросов отпадет.

Спасибо, книжку почитаю! smile) А можно вкратце, почему так происходит?

Автор: aleksandy 11.2.2010, 10:05
http://sadhamster.blogspot.com/2009/12/blog-post.html#more

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)