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


Автор: skhilkov 11.12.2009, 07:14
Ничего не понимаю... то ли лыжи не едут... 
В общем есть регексп, в нем есть reluctant quantifier .*? Я правильно понимаю что он должен включать в себя подстроку минимальной длины, при условии что правая и левая часть регекспа совпадают... В общем пример в студию!

Код

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package testsandexamples;

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

/**
 *
 * @author skhil
 */
public class Main
{

    
    private static String text = "</span>&nbsp;<a href=\"/real-estate/apartments-sale/page30/\">30</a>&nbsp;&nbsp;<a href=\"/real-estate/apartments-sale/page2/\" class=\"nxt-page more\"><span>следующая</span>";
    

    public static void main(String[] args)
    {

        Pattern pat = Pattern.compile("href=\"(.*?)\\Qclass=\"nxt-page more\">\\E", Pattern.DOTALL|Pattern.UNICODE_CASE);// class=\"nxt-page more\"><span>следующая</span>\\E");//"\\Q<object_id>\\E(.*)\\Q</object_id>\\E";

        Matcher m = pat.matcher(text);
        while (m.find())
        {
            System.out.println("Found!"+m.group(1));
        }

    }
}



Вот хоть убей - выводит /real-estate/apartments-sale/page30/">30</a>&nbsp;&nbsp;<a href="/real-estate/apartments-sale/page2/
 а мне надо /real-estate/apartments-sale/page2/ !!

Я вот что подумал... может берется подстрока наименьшей длины, но только от левой части регекспа?? А правая сторона побоку?

Автор: skhilkov 11.12.2009, 13:33
Вот сижу и туплю... усли строку оставить 

Код

String text = "<a href=\"/real-estate/apartments-sale/page2/\" class=\"nxt-page more\"><span>следующая</span>";


То выводится то что нужно.... блин, ну как сделать чтоб искалась наименьшая строка? Ведь reluctant для того и сделаны....
Самое интересное, что если в примере заменить .*? на .* НИФИГА не меняется.... это чтож за беспредел такой (((

Автор: Дрон 11.12.2009, 14:01
Цитата(skhilkov @  11.12.2009,  07:14 Найти цитируемый пост)
Я вот что подумал... может берется подстрока наименьшей длины, но только от левой части регекспа?? А правая сторона побоку?

Правильно.
Регулярное выражение работает слева направо, находит первый href=" затем берёт все символы подряд, пока не наткнётся на class=\"nxt-page more\">

Автор: skhilkov 11.12.2009, 14:15
Дрон,  спасибо тебе! А как же быть в таком случае? 
Приходит на ум такой изврат:  воспользоваться lastIndexOf() класса String. 
Знает кто-нибудь менее извращенный вариант?

Автор: Дрон 11.12.2009, 16:20
skhilkov, а что если в начало регэкспа добавить (.*) ?
То есть вот так:
Код
"(.*)href=\"(.*?)\\Qclass=\"nxt-page more\">\\E"


Только тогда смотреть результат надо будет не в первой группе, а во второй.

Вообще в сети немало страниц, где можно хоть онлайн потестировать регулярные выражения.

PS: Я чего-то не помню, а что такое \Q и \E ?

Автор: skhilkov 13.12.2009, 16:39
Дрон, +1 спасибо! Я уже извратился было с lastIndexOf, но сейчас переделаю, это лучше!

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