Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Matcher.matches() и Matcher.replace()


Автор: FlasH 20.5.2008, 12:31
Насколько я понимаю, matches() должен проверить строку на соотвествие регексу, а replace() соотвествующее место заменить.
replace работает так, как и ожидается, а вот matches почему-то не матчит строчку, которая явно подходит под регекс.
Я не сумел найти в документации внятного объяснения, или не понял что в нём написано. 

Прокомментируйте ситуацию, как обходиться с matches? Можно перед matches оборачивать regex wide-масками, но не стукнет ли это однажды?

Код

    public static void main(String[] args) {
        String regexp = "new StringBuilder";
        
        String source = "123 new StringBuilder().append(FIXMessageTransformer.debugAmend(amend)).append(\". Ticket: \").append(ticket).toString()";
        
        String replacement = "<found here>";
        System.out.println("Source:\n"+source+"\nRegexp:\n"+regexp);
        
        System.out.println(Pattern.compile(regexp).matcher(source).matches());
        System.out.println(Pattern.compile(".*?"+regexp+".*?").matcher(source).matches());
        
        System.out.println(Pattern.compile(regexp).matcher(source).replaceAll(replacement));
    }

Автор: Kangaroo 20.5.2008, 13:18
Цитата(FlasH @  20.5.2008,  12:31 Найти цитируемый пост)
а вот matches почему-то не матчит строчку, которая явно подходит под регекс.


JavaDoc:
Цитата

    /**
     * Attempts to match the entire region against the pattern.
     *
     * <p> If the match succeeds then more information can be obtained via the
     * <tt>start</tt>, <tt>end</tt>, and <tt>group</tt> methods.  </p>
     *
     * @return  <tt>true</tt> if, and only if, the entire region sequence
     *          matches this matcher's pattern

     */


То есть он проверяет по рег. выражению всю строку.

Автор: FlasH 20.5.2008, 13:32
и классическое решение моего вопроса (содержится ли область подходящая под regex в этой строке) соотвественно
Код

.matches("^.*"+regex+".*$")


или есть более правильные подходы (более быстрые/экономичные) ?

Автор: ivg 20.5.2008, 13:56
Код

    public static void main(String[] args) {
        String expr = "new StringBuilder";
        
        String source = "123 new StringBuilder().append(FIXMessageTransformer.debugAmend(amend)).append(\". Ticket: \").append(ticket).toString()";
        
        String replacement = "<found here>";
        System.out.println("Source:\n"+source+"\nExpr:\n"+expr);
        
        System.out.println(source.contains(expr)); // @since 1.5
        
        System.out.println(source.replace(expr, replacement)); // @since 1.5
    }

Автор: FlasH 20.5.2008, 15:15
возможно пример regex неудачный.
вот так: 

Код

String regex = "new +?StringBuilder";

речь имменно о регэксах

String.contains() в качестве параметра использует подстроку, не регэкс

Автор: LSD 20.5.2008, 15:33
Цитата(FlasH @  20.5.2008,  14:32 Найти цитируемый пост)
есть более правильные подходы (более быстрые/экономичные) ?

find() smile

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