LINUX.ORG.RU

Чего-то не могу сообразить с яваскриптовским регекспом.

 , ,


0

1

Хочу сделать такую функцию:

function idsFromStr( str )
{
    //var idr = new RegExp('_(\d+)', 'g');
    //var idr = /.*_(\d+)(?:_\|$)/g;
    //return idr.exec( str );
    //return str.match(idr);
    //return /_(\d+)(?:_|$)/g.exec(str);
    return str.match(/_(\d+)(?:_|$)/g);
}
Должна принимать строки вида: «sdfdf23sdf_sdf_10_3_0».
И возвращать массив [ 10, 3, 0 ].
То, что я написал, однако, не работает:
var match = idsFromStr("sdfdf23sdf_sdf_10_3_0");
alert(match[0] + "; " + match[1] + "; " + match[2] + "; " + match[3]);
Выдаёт:

_10_; _0; undefined; undefined.

Что я делаю не так?:) Что-то не могу понять логику работы JSовских регекспов.

★★★★★

Последнее исправление: Bad_ptr (всего исправлений: 1)

alert(match[0] + "; " + match[1] + "; " + match[2] + "; " + match[3]);

man Array.join. Да и приведение массива к строке всё нормально выведет через запятую.

Ты написал что-то странное, а результат вполне закономерен. Пока хз как сделать нормально, можно так:

>>> "sdfdf23sdf_sdf_10_3_0".match(/_\d+/g)
Array ["_10", "_3", "_0"]
И потом пройтись по массиву, убрать _ и привести строки к числам.

Kalashnikov ★★★
()
Ответ на: комментарий от Kalashnikov

Вообще, так можно.

function ids(string) {
	var ret = [];
	var parts = string.split("_");
	for (var i=parts.length -1; i; i--) {
		if (! isNaN(parts[i]-0) )	// хз как тут лучше, может parseInt(parts[i]) == parts[i], или parts[i].match(/$\d+^/)
			ret.push( parseInt(parts[i]) );
		else
			break;
	}
	return ret.reverse();
}

Kalashnikov ★★★
()
Ответ на: комментарий от Kalashnikov

Ок. Спасибо. Но я правильно понимаю, что из результата regexp.exec или string.match никак нельзя выцепить захваченные группы(т.е. то, что в скобках и внутрях регекспа доступно по $1 $2 и т.д. ...)?

Bad_ptr ★★★★★
() автор топика
Ответ на: комментарий от Kalashnikov

Такс... Порывшись по stackoverflow сделал вот так:

function idsFromStr( str )
{
    var rx = /_(\d+)/g;
    var result = [];
    var match = rx.exec(str);
    while( match )
    {
        result.push(match[1]);
        match = rx.exec(str);
    }
    return result;
}
Кажись, работает. Но имх. странное, однако, поведение регекспов в этом JS. :)

Bad_ptr ★★★★★
() автор топика
Ответ на: комментарий от Kalashnikov

не с g. Вариант с СО как раз без него

только что попробовал. С г работает нормально. Без г — впадает в бесконечный луп.

Bad_ptr ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.