Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   RegExp. Квантификаторы в группе просмотра. (http://www.flasher.ru/forum/showthread.php?t=135527)

udaaff 25.01.2010 18:28

RegExp. Квантификаторы в группе просмотра.
 
Пытаюсь из текстового файла следующей структуры
Код:

(27074229, '151.00', '0.00', '0.00', 0),
(6263225, '260.00', '158.00', '180.00', 0),
(75838, '241.00', '0.00', '0.00', 0),
(4678986, '124.00', '0.00', '0.00', 0)
и так далее...

выбрать в массив числа, отмеченные красным, следующим образом:
Код AS3:

var urlLoader:URLLoader = new URLLoader();
urlLoader.addEventListener(Event.COMPLETE, urlLoader_completeHandler);
urlLoader.load(new URLRequest("records.sql"));
 
function urlLoader_completeHandler(event:Event):void
{
        var str:String = urlLoader.data;
        var array:Array = str.match(/(?<=^\(\d+, ')\d+\.\d+/gmi);
        trace(array); // ни одного результата
}

Если регулярное выражение меняю на
Код:

/(?<=^\(\d{8}, ')\d+\.\d+/gmi
т.е. указываю конкретное количество цифр, то находятся все нужные числа в блоках, где первое число содержит восемь знаков. Но так-как количество цифр не определено, то такой способ не подходит.

И сам вопрос: можно ли, вообще, использовать квантификаторы, которые не определяют точное количество символов, в группах просмотра?

Саму задачу я решил с помощью
Код:

/(?<=\d, ')\d+\.\d+/gi
, но вопрос все же интересует.

cursed_man 25.01.2010 18:48

а если проще ?

Код:

\(\d+, \'([^']+)\',[^)]+\)

udaaff 25.01.2010 19:29

Т.е.
Код:

function urlLoader_completeHandler(event:Event):void
{
        var str:String = urlLoader.data;
        var array:Array = [];
        var pattern:RegExp = /\(\d+, \'([^']+)\',[^)]+\)/g;
        var result:Object = pattern.exec(str);
       
        while (result)
        {
                array.push(result[1]);
                result = pattern.exec(str);
        }
        trace(array.length);
}

?

Или как-то по-другому можно еще выцепить значение из группы ([^']+)?
Если такой способ имелся в виду, то он работает на порядок медленнее.

cursed_man 25.01.2010 20:20

мда, думал у флеша с этим проще...

ничего не придумал, кроме этого (и это похоже на изврат...):

Код:

var input:String = "(27074229, '151.00', '0.00', '0.00', 0),\n(6263225, '260.00', '158.00', '180.00', 0),\n(75838, '241.00', '0.00', '0.00', 0),\n(4678986, '124.00', '0.00', '0.00', 0)";
var exp:RegExp = /\(\d+, \'([^']+)\',[^)]+\)/g;
var result:Array = input.replace(exp,'$1').split(/,\n/);


udaaff 25.01.2010 20:45

Тоже была мысль через replace... Религия не позволила :)
Хоть и похоже на изврат, но работает быстрее чем все предыдущие варианты.
Но я так и не понял, почему не пашет /(?<=^\(\d+, ')\d+\.\d+/gmi

cursed_man 25.01.2010 21:14

"в отличие от заглядывания вперед, заглядывание назад может работать только с фиксированным числом проверяемых символов"

нашел в справках...

udaaff 25.01.2010 21:17

Спасибо. А я искал, и ни черта не нашел.

gloomyBrain 25.01.2010 21:29

Слушайте, а подскажите плиз, как лучше вот такое перевести в регулярку?
Код AS3:

//*
var type:String = fullType.indexOf("::") == -1 ? fullType : fullType.split("::")[1];
type = type.indexOf(".<") == -1 ? type : type.split(".<")[0];
//*/

Или толковый ресурс по регуляркам... А то чё я как маленький? =)

cursed_man 25.01.2010 21:43

можно пример строки и результат?

udaaff 25.01.2010 21:44

Примеры строки и того, что в ней нужно найти, не помешали бы.


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

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