Дата публикации: 20.04.2021

Удаляем вложенные выражения одной строчкой JavaScript.

8bd108ae

Дернуто с блога о JavaScript и Регулярных выражений.

Удаляем вложенные выражения одной строчкой JavaScript.

Хочу рассказать вам товарищи девелоперы о том, как я додумался убрать вложенные паттерны из строки. Думаю, если вы еще не ушли, то разбираетесь в 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 = .split("\uFFFF"); if (parts.length < 2) { last = output.push(match) - 1; } else { output = parts + output + parts; } str = str.replace(re, "\uFFFF"); } // output ->

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

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

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

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

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

Что я еще читаю по этой теме: Ненавижу Рапидшару Превращение текстовых ссылок в настоящие НА ВСЕХ СТАНИЦАХ (linkification)

В закладки: Конструктор регулярных выражений