Вход

Просмотр полной версии : Поиск подстрок (Метод match)


Игорь87
02.01.2011, 22:30
Здравствуйте!

Есть строка 'dY%bd#!cL!%h#dY*'.Нужно заполнить массив буквы подряд и не буквы подряд.
делаю так :

var resorse = 'dY%bd#!cL!%h#dY*';
var result = resorse.match(/([a-zA-Z]+)([^a-zA-Z]+)/g);
alert(result[1]); //Выводит 'bd#!'
alert(result[1][0]); //Выводит 'b',а нужно 'bd';
alert(result[1][1]); //Выводит 'd',а нужно '#!';

Возможно ли чтобы result[1] содержал массив полных вхождений шаблона,элемент result[1][0] содержит массив вхождений первой подмаски (буквы),элемент result[1][1] содержит массив вхождений второй подмаски (не буквы).Спасибо.

B@rmaley.e><e
02.01.2011, 22:48
<телепат>
На php пишете?
</телепат>
Даже с флагом global match возвращает простой массив (не двумерный) совпавших вхождений. Было там что-нибудь для запоминания / не было - никого не волнует. В результирующем массиве этих данных не будет.
А result[1][0] на самом деле не что иное как result[1].charAt(0), т.к. result[1] - строка.

Поэтому запускайте цикл и на каждой итерации применяйте регэксп без флага global (Тут вообще больше exec (http://javascript.ru/RegExp/exec) подойдет).

P.S. resource пишется немного по-другому.

with-love-from-siberia
02.01.2011, 23:22
Так как задача описана сейчас - можно реализовать разным способами, но, скорее всего, это будет решением далеким от требуемого. Скорее всего автору надо бы описать подробнее запросы, а еще лучше - показать, для чего это все надо. Возможно после этого можно было бы предложить правильное решение.

Aetae
03.01.2011, 01:01
Так как задача описана сейчас - можно реализовать разным способами, но, скорее всего, это будет решением далеким от требуемого.
Так как задача подана сейчас - можно решить только анальным способом. Все внимание сюда:
alert(result[1]); //Выводит 'bd#!'
alert(result[1][0]); //Выводит 'b',а нужно 'bd';
alert(result[1][1]); //Выводит 'd',а нужно '#!';


Нет, можно конечно сделать и как-то так, лол:

result=[[],['bd','#!','bd#!']]
Array.prototype.toString=function(){return this[2]}
alert(result[1]);
alert(result[1][0]);
alert(result[1][1]);


...а решение то вот:
var r = /([a-z]+)([^a-z]+)/gi;
var str = 'dY%bd#!cL!%h#dY*';
var result=[],i=0;
while(result[i++]=r.exec(str));
alert(result[1][0]);
alert(result[1][1]);
alert(result[1][2]);

with-love-from-siberia
03.01.2011, 13:23
Мне кажется, что автору надо что-то вроде этого:

var s = 'dY%bd#!cL!%h#dY*';
var r = s.match(/\w+|\W+/g);
alert(r.join('\n'));

но только "раскиданное" по двум массивам - один цифробуквенные подстроки, другой - остальные символы.

Автор не смог ясно и толково объяснить что же он хочет получить в результате - то есть что на входе мы знаем, а что на выходе - нет. В общем. это гадание чистой воды и заниматься телепатией не хочется.