Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Поиск подстрок (Метод match) (https://javascript.ru/forum/misc/14146-poisk-podstrok-metod-match.html)

Игорь87 02.01.2011 22:30

Поиск подстрок (Метод match)
 
Здравствуйте!

Есть строка '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 подойдет).

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

with-love-from-siberia 02.01.2011 23:22

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

Aetae 03.01.2011 01:01

Цитата:

Сообщение от with-love-from-siberia (Сообщение 86022)
Так как задача описана сейчас - можно реализовать разным способами, но, скорее всего, это будет решением далеким от требуемого.

Так как задача подана сейчас - можно решить только анальным способом. Все внимание сюда:
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'));

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

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


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