Форум 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=138361)

loover 05.04.2010 23:17

одновремменная замена нескольких рег. выражений
 
для замены в строке можно использовать String.replace(pattern,repl), где pattern может быть строкой или рег. выражением, а repl - строкой или функцией. можно ли за один проход replace сделать несколько замен? в php pattern может быть массивом. есть ли какое-нить решение для as3?

wvxvw 05.04.2010 23:23

Нет, учитесь писать нормальные регекспы, чтобы не надо было делать в несколько заходов - то, что есть в PHP - бред сивого мерина.

MrPoma 06.04.2010 01:44

Плохо, что не умею пользоваться. Извените.
Как обработать строку: "Коля потратил %coins% на %apples% яблок"?

loover 06.04.2010 02:09

присоединяюсь к вопросу.

Xero201 06.04.2010 02:55

Вот первое, что пришло на ночь глядя:)
Код AS3:

var str:String = "Коля потратил %coins% на %apples% яблок"
trace(str);
var reg:RegExp = /%coins%|%apples%/g;
var coins:String = "100 рублей";
var apples:int =50;
var res:Array;
while(res=reg.exec(str)){
        var repl:String;
        switch(res[0]){
                case "%coins%": repl = coins; break;
                case "%apples%": repl = apples.toString(); break;
        }
        str = str.substr(0, reg.lastIndex-res[0].length)+repl+str.substr(reg.lastIndex,str.length);
        reg.lastIndex -=(res[0].length-repl.length);
}
trace(str);


wvxvw 06.04.2010 03:13

Вариант номер раз, самый простой и удобный:
Код AS3:

var s:String = "Коля потратил %coins% на %apples% яблок";
var re0:RegExp = /%\w+%/g;
s = s.replace(re0, reHelper);
function reHelper(match:String, index:int, all:String):String
{
        switch (match)
        {
                case "%coins%":
                        return "$100";
                case "%apples%":
                        return "5";
        }
        return match;
}
trace(s);

Код AS3:

var re1:RegExp = /(%coins%)(.*)(%apples%)/g;
var s1:String = "Коля потратил %coins% на %apples% яблок";
s1 = s1.replace(re1, "$$100$25");
trace(s1);

Вариант не универсальный, но от задачи зависит.

loover 06.04.2010 21:23

wvxvw, первый вариант мне показался слишком громоздким. проще 2 раза вызвать replace. вопрос по второму варианту. как обработать строку
Код AS3:

var s1:String = "Коля потратил zzz на aaa яблок";


expl 06.04.2010 21:49

передаем в этот метод параметр:
Код AS3:

parametr = {
    zzz:100,
    aaa:25
}

Но строка должна быть, например "Коля потратил %zzz% на %aaa% яблок"
Делаем регулярку... Нафиг регулярку, делаем просто:
Код AS3:

    var array:Array = s1.split("%");

Теперь можно пройтись ципклом и все элементы с четным индексом заменить:
Код AS3:

    for(...
        if (index % 2 == 0)
        {
            array[index] = parametr[array[index]]
        }
    ...
    var text:String = array.join("");//Наша строчка "Коля потратил 100 на 25 яблок"

ИМХО самый гибкий вариант

wvxvw 06.04.2010 23:02

expl:
Если извесно, что есть всего 2 переменные, которые надо заменить, и что они всегда идут в одинаковом порядке - то мой второй вариант будет ну, если не быстрее, то по крайней мере раза в 3 короче. :)
В то время как первый вариант заменит подстроки в любой последовательности и любом количестве.

loover:
Проще, но однозначно в 2 раза дольше. Почему вариант в две с половиной строчки вам кажется громоздким - мне, наверное не понять :) Ваш вопрос "по второму варианту" откровенно поставил меня в тупик - а что же тогда делат код приведенный выше? :)

Xero201 06.04.2010 23:40

2 expl, ну и придумал) У меня как раз диплом по защите программ, включу в обфускацию)
2 wvxvw: функция реально громоздкая – вот вариант в одну строчку:
Код AS3:

function reHelper(match:String, index:int, all:String):String{switch (match){case "%coins%": return "$100";        case "%apples%":  return "5";}return match; }


loover 07.04.2010 00:05

wvxvw, просто я убрал "%" ) а какую роль играет этот знак?

wvxvw 07.04.2010 00:12

Никакой, просто тридцать седьмой знак в таблице ASCII.

MrPoma 07.04.2010 01:10

Ой. Я в строке допустил ошибку - Коля потратил %coins% монет на %apples% яблок. После чего ее 5 раз повторили.

wvxvw, спасибо.


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

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