Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Конструкция .+? в регулярном выражении (http://www.flasher.ru/forum/showthread.php?t=207980)

SvetozarPNZ 23.05.2014 15:47

Конструкция .+? в регулярном выражении
 
Что означает такая конструкция
Код AS3:

.+?

в регулярном выражении?

Нашел ее, когда искал как выявлять ссылки из html-кода.

На мой взгляд она аналогична
Код AS3:

.*

Но если меняешь, то ничего не работает.

Пример для тестирования.

Код AS3:

package 
{
        import flash.events.Event;
        import flash.net.*;
        import flash.display.*;       
 
        public class Main extends MovieClip
        {
                var loader:URLLoader = new URLLoader();
                var str:String= '';
                var regExp = /<a([^>]+)>(.+?)<\/a>/gis;
                public function Main()
                {                       
 
                        var pageLink:URLRequest = new URLRequest("http://technoflash.ru");
                        loader.load(pageLink);
                        loader.addEventListener(Event.COMPLETE, onComplete);
                }
                function onComplete(event:Event):void
                {                       
                        trace(loader.data.match(regExp))
                }
        }
}

Мне посоветовали сервис http://www.regexr.com/ для тестирования регексов. Так вот там подмена
Код AS3:

.+?

на
Код AS3:

.*

не меняет результата, что еще больше меня путает.

КорДум 23.05.2014 15:56

Цитата:

.+?
Цитата:

.*
Логически аналогичны. В первом "любой символ в количестве 1+ штук, которого может не быть". Во втором: "любой символ в количестве 0+ штук".

КорДум 23.05.2014 16:08

М. Секунду. Я проверил, первая регулярка вытаскивает только один символ, тогда как вторая может вытащить многим больше.
Код AS3:

.* === (.+)?
.* !== .+?

Добавлено через 1 минуту
Символ "?" применителен для одного символа или группы. Поэтому нужно ему подавать группу, без нее он вытаскивает лишь один символ.

SvetozarPNZ 23.05.2014 16:19

А что ж во втором это значит, что ? вообще не работает?

КорДум 23.05.2014 16:22

Честно говоря, я не разбирался в Вашей полной регулярке, я протестировал конкретный этот кусочек. В моем тесте ".+?" вытаскивает не более одного символа, что, в принципе, логично.
Какое поведение Вы у себя наблюдаете?

SvetozarPNZ 23.05.2014 16:31

Наблюдаю, то, что и хочу получить
Цитата:

<a href="http://technoflash.ru" title="На главную"><img src="img/logo.png" width="277" height="37" alt="technoflash.ru" /></a>,<a href="http://technoflash.ru" title="На главную"><img src="img/logo.png" width="277" height="37" alt="technoflash.ru" /></a> и т.д.
Не понимаю, почему я это получаю ))

Добавлено через 11 минут
Все нашел-нашел-нашел! Разобрался:
Цитата:

Добавьте знак вопроса (? после любого квантификатора, чтобы изменить его на то, что известно как «ленивый» квантификатор.
Получается, что в моем примере вопросительный знак для конструкции (.+?) способствует нахождению как можно меньшее число символов, подходящих под шаблон.

MikroAcse 23.05.2014 18:20

Кратко:
Есть строка "abaca".
Есть регулярка /a((.+)?)a/
Она выдаст тебе "b".
Без знака вопроса (/a(.+)a/) она выдаст "bac".

КорДум 23.05.2014 19:36

Цитата:

Получается, что в моем примере вопросительный знак для конструкции (.+?) способствует нахождению как можно меньшее число символов, подходящих под шаблон.
Интересно, про еще один смысл "?" не знал, если использовать его с квантификаторами.

2MikroAcse, ты не о том. Обрами свои регулярки в ^ И $ и увидишь, что у тебя они идентичны, так как ты используешь "?" для группы. И в первой регулярке можно смело снести внешнюю пару скобок, чтобы итоговый результат не давал лишнее совпадение.

MikroAcse 23.05.2014 23:04

КорДум, ага. Спасибо за пояснения.


Часовой пояс GMT +4, время: 15:45.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.