Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   оптимизация множественной замены и поиска (https://javascript.ru/forum/misc/14434-optimizaciya-mnozhestvennojj-zameny-i-poiska.html)

Askhsiv_1 16.01.2011 19:07

оптимизация множественной замены и поиска (регулярные выражения)
 
Здравствуй Олл, всезнающий и всемогущий:)

есть 2 момента в коде, которые хотелось бы оптимизировать, прошу помочь

номер раз: множественная замена в строке элементами массива

дано
xx = "text|aaaa|text text|cccc| texttext |bbbb|text |cccc| text |aaaa|text text|dddd|text"

yy = {aaaa:'_w1_', bbbb:'_w2_', cccc:'_w3_', dddd:'_w4_'}

надо все встречающиеся в строке xx конструкции |слово| заменить на значения массива yy с одноимённым ключом

сначала я по неопытности делал так:
r1 = xx.replace(/\|aaaa\|/g, yy.aaaa);
r2 = r1.replace(/\|bbbb\|/g, yy.bbbb);
r3 = r2.replace(/\|cccc\|/g, yy.cccc);
zz = r3.replace(/\|dddd\|/g, yy.dddd);

разумеется всё работает, но... сами понимаете)

потом я вспомнил как в PHP можно заменять элементы одного массива соответствующими элементами другого,
жаль в JS такого нету. почитал про Спецсимволы в строке замены и попробовал так:
zz = xx.replace(/\|(\w*)\|/g, yy['$1']);

но ничего не вышло. вставляет undefined вместо того что надо.
кстати кто может объяснить посему?

потом почитал про Замену через функцию и сделал так:
function replacer(str, p) { return str.replace(/\|\w*\|/, '') + yy[p] } 

zz = xx.replace(/\|(\w*)\|/g, replacer)

потом подумал получше и сделал так:
function replacer(s, p1, p2) { return p1+yy[p2] }

zz = xx.replace(/([^\|]*)\|(\w*)\|/g, replacer)

оба варианта работают, но есть стойкое ощущение, что что-то упустил и можно сделать проще и лучше

для удобства проверки:
document.write(xx+'<br>'+zz)



номер два: соответствие в поиске для начала/конца строки или другого спецсимвола

допустим надо в cookies найти значение какой-нибудь куки.
варианты строки cookies могут быть такими:

- aaa=111
- aaa=111; bbb=222
- bbb=222; aaa=111
- bbb=222; aaa=111; ccc=333

то есть наша кука может быть одна, в начале, в конце и в середине строки
чтобы узнать её значение пишу регулярку:
cooka = /aaa=[^;]*;|aaa=[^;]*$/.exec(document.cookie);

zz = cooka[0].replace(/aaa=|;/g, '');

меня тут смущает это: /.....x|.....$/ где x - любой символ или спецсимвол, ..... - одинаковые выражения
тоже самое и с началом строки, ну не умею я с ними или делать, когда они уже часть выражения


может у кого-то есть мысли как можно оптимизировать вышеописанные решения

Aetae 16.01.2011 20:10

1.
var x = "text|aaaa|text text|cccc| text|none|text |bbbb|text |cccc| text |aaaa|text text|dddd|text"
var y = {aaaa:'_w1_', bbbb:'_w2_', cccc:'_w3_', dddd:'_w4_'}
alert( x.replace(/\|(\w*?)\|/g, function(a,b){ return y[b]||a } ) )



2.
http://javascript.ru/unsorted/top-10...e-deletecookie

Askhsiv_1 16.01.2011 21:59

Aetae

класс, особенно первое)

а второе, я вместо большой навороченной функции из ссылки написал решение своего вопроса основанное на ней:
matches = /lang=([^;]*)/.exec(document.cookie)
cooka = matches[1]


благодарю:)


Часовой пояс GMT +3, время: 22:54.