Получать новости в rss

Новости ajaxed.ru

Последние комментарии

RSS

Поиск по сайту

Удаляем вложенные выражения одной строчкой JavaScript.
Рейтинг пользователей: / 0
ХудшийЛучший 
Новости из мира AJAX - Все самое новое и интересное об AJAX
Автор: Administrator   
17.12.2009 10:11

Хочу рассказать вам товарищи девелоперы о том, как я додумался убрать вложенные паттерны из строки. Думаю, если вы еще не ушли, то разбираетесь в JavaScript и сталкивались с проблеммой удаления вложенных паттернов из строк.

Давайте взглянем на код:

var str = "abc<1<2<>3>4>def";
while (str != (str = str.replace(/<[^<>]*>/g, "")));
// str -> "abcdef"

Заметим что данное регулярное выражение в одну строчку даже не пытается обработать весь текст.
Этот цикл просто заменяет <..> на пустую строку. Цикл работает как бы изнутри, т.е. ищет открывающую скобку, затем ищет ищет и если снова нашел открывающую скобку, то поиск продолжится от нее до закрывающей(но не открывающей). Как только нашел их обоих 8).. то хаменяет на пустоту. Поменял и пошел снова с начала строки, и так пока не будет найдено открывающей плюс закрывающей скобки (в упомянутом порядке)

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

var str = "abc(d(e())f)(gh)ijk()",
re = /\([^()]*\)/,
output = [],
match, parts, last;
while (match = re.exec(str)) {
parts = match[0].split("\uFFFF");
if (parts.length < 2) {
last = output.push(match[0]) - 1;
} else {
output[last] = parts[0] + output[last] + parts[1];
}
str = str.replace(re, "\uFFFF");
}
// output -> ["(d(e())f)", "(gh)", "()"]

Так как мы ищем по хитрому, пересобирая каждую готовую пару, то нам нужно как-то маркировать позицию от которой было удалено предидущее совпадение. Я был простой парень, поэтому использовал Unicode код: \uFFFF для пометки таких позиций, потому что этот код нигде не используется.

Это самый легкий и короткий код который я написал, точнее даже не я, а Стив Левитан. . Но если вы пошарите его сайтег, то найдете еще кучку вариантов выполнения той же самой фигни. Это фанатизм. Зато почувствуйте силу регулярок.

Да и еще.. в этом примере использовались отрицательные символы типа [^()] для поиска. Но ведь бывает что искать нужно не по одному символу, а по нескольким, и тогда в силу вступает черная магия регулярных выражений. Вы можете написать так: /<<(?:(?!<<|>>)[\S\s])*>>/ . Да просто замените шаблончег и все.

Стиву на это отвечали:
Круто Стивег, теперь я смогу дописать свой List парсерочег на JavaScript-еге.

Интересно что думают Русские перцы по поводу этого всего ?

 

Добавить комментарий


Защитный код
Обновить