25.01.2012, 01:12
|
Аспирант
|
|
Регистрация: 29.09.2011
Сообщений: 42
|
|
Небольшой вопрос по рег выр
"abcdef".match(/\w{2}/g)
//вернёт [ab,cd,ef]
как подправить рег выр, чтобы вернуло [ab,bc,cd,de,ef] сижу, туплю не могу понять (
|
|
25.01.2012, 02:49
|
что-то знаю
|
|
Регистрация: 24.05.2009
Сообщений: 5,176
|
|
никак, регулярные выражения не умеют искать в обратную сторону. Если движок схавал символ для предыдущего правила, то он не сможет этот же символ добавить в следующее.
|
|
25.01.2012, 03:29
|
|
Модератор
|
|
Регистрация: 27.04.2010
Сообщений: 3,417
|
|
Можно с извратом и использованием двух массивов.
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
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,118
|
|
Сообщение от trikadin
|
Можно с извратом
|
alert("abcdef".replace(/(\w)/g,'$1$1').replace(/^\w|\w$/g,'').match(/\w{2}/g))
|
|
25.01.2012, 08:20
|
Аспирант
|
|
Регистрация: 29.09.2011
Сообщений: 42
|
|
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);
Можно здесь что-нибудь упростить?
Последний раз редактировалось qwertyuiop10, 25.01.2012 в 08:23.
|
|
25.01.2012, 09:25
|
|
猫
|
|
Регистрация: 07.06.2007
Сообщений: 7,504
|
|
Сообщение от qwertyuiop10
|
Можно здесь что-нибудь упростить?
|
Можно совсем не использовать регулярные выражения.
Разбили строку на массив, прошлись первый раз по массиву вернули первые три элемента, удалили первый элемент и т.д. крутим цикл пока в массиве более трех элементов.
Пример писать некогда, но регулярки тут необязательны.
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
|
|
25.01.2012, 10:10
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,118
|
|
Вариант ...
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'))
|
|
25.01.2012, 12:00
|
Лаборант :-)
|
|
Регистрация: 08.11.2011
Сообщений: 806
|
|
поигрался со split :-)
alert("abcdef".split(/(?=(\w))/).join('').match(/\w\w/g))
|
|
25.01.2012, 15:34
|
|
Модератор
|
|
Регистрация: 27.04.2010
Сообщений: 3,417
|
|
qwertyuiop10, ну я прям тащусь) Вы определяйтесь в следующий раз, по два вам элемента нужно или по три.
|
|
25.01.2012, 15:37
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
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(",") + "]");
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
|
|