Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Небольшой вопрос по рег выр (https://javascript.ru/forum/misc/25086-nebolshojj-vopros-po-reg-vyr.html)

qwertyuiop10 25.01.2012 01:12

Небольшой вопрос по рег выр
 
"abcdef".match(/\w{2}/g)
//вернёт [ab,cd,ef]

как подправить рег выр, чтобы вернуло [ab,bc,cd,de,ef] сижу, туплю не могу понять (

devote 25.01.2012 02:49

никак, регулярные выражения не умеют искать в обратную сторону. Если движок схавал символ для предыдущего правила, то он не сможет этот же символ добавить в следующее.

trikadin 25.01.2012 03:29

Можно с извратом и использованием двух массивов.

str= "abcdef";
arrExec= [];
arrRes=[];
reg= /\w\w/g
while ((arrExec= reg.exec(str)) !== null) {
 arrRes.push(arrExec);
 --reg.lastIndex;
};
alert(arrRes);


А можно и с одним массивом, но с ещё большим извратом.

str= "abcdef";
arrRes=[];
reg= /\w\w/g
while (arrRes.push(reg.exec(str)) && arrRes[arrRes.length-1] !== null) {
 --reg.lastIndex;
};
arrRes.pop(); // ибо последний элемент null, удаляем его
alert(arrRes);

рони 25.01.2012 08:17

Цитата:

Сообщение от trikadin
Можно с извратом

:yes:
alert("abcdef".replace(/(\w)/g,'$1$1').replace(/^\w|\w$/g,'').match(/\w{2}/g))

qwertyuiop10 25.01.2012 08:20

trikadin,
Спасибо, но стоит немного изменить регуляторку, как всё не работает, немного изменил, теперь циклом меняя lastIndex с конца, переберём все значения.
str= "abcdef";
l=str.length;
arrExec= [];
arrRes=[];
reg= /\w\w\w/g

while(l--){
  reg.lastIndex=l;
  if((arrExec=reg.exec(str))!==null){
    arrRes.push(arrExec);
  }
}
arrRes.reverse();
alert(arrRes);


Можно здесь что-нибудь упростить?

Gozar 25.01.2012 09:25

Цитата:

Сообщение от qwertyuiop10 (Сообщение 152706)
Можно здесь что-нибудь упростить?

Можно совсем не использовать регулярные выражения.

Разбили строку на массив, прошлись первый раз по массиву вернули первые три элемента, удалили первый элемент и т.д. крутим цикл пока в массиве более трех элементов.

Пример писать некогда, но регулярки тут необязательны.

рони 25.01.2012 10:10

Вариант ...
function foo(f, c) {
    var c = c - 1, a = f.split(""), e = a.length - c;
    for (var b = 0; b < e; b++)
    for (var d = 1; d <= c; d++) a[b] += a[b + d];
    return a.slice(0, e)
};
var str =  "abcdef";
alert([foo(str,1),foo(str,2),foo(str,3)].join('\n'))

Pavel M. 25.01.2012 12:00

поигрался со split :-)
alert("abcdef".split(/(?=(\w))/).join('').match(/\w\w/g))

trikadin 25.01.2012 15:34

qwertyuiop10, ну я прям тащусь) Вы определяйтесь в следующий раз, по два вам элемента нужно или по три.

nerv_ 25.01.2012 15:37

var x = "abcdef";
var z = /.(?=(.))/g;
var a = [];

while(w = z.exec(x)) a.push(w[0] + w[1]);

alert("[" + a.join(",") + "]");

var x = "abcdef", z = [];
for(var i = 0; i < x.length - 1; i++) z.push(x.substring(i, i + 2));

alert("[" + z.join(",") + "]");


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