Javascript.RU

Особенности регулярных выражений в Javascript

Update: Более новый материал по этой теме находится по адресу https://learn.javascript.ru/regexp-specials.

Регулярные выражения в javascript немного странные. Вроде - перловые, обычные, но с подводными камнями, на которые натыкаются даже опытные javascript-разработчики.

Эта статья ставит целью перечислить неожиданные фишки и особенности RegExp в краткой и понятной форме.

Общую информацию о регулярных выражениях в javascript вы можете найти в статье Регулярные выражения.

Для поиска в многострочном режиме почти все модификации перловых регэкспов используют специальный multiline-флаг.

И javascript здесь не исключение.

Попробуем же сделать поиск и замену многострочного вхождения. Скажем, будем заменять [u] ... [/u] на тэг подчеркивания: <u>:

function bbtagit(text) {
  text = text.replace(/\[u\](.*?)\[\/u\]/gim, '<u>$1</u>')
 
  return text
}

var line = "[u]мой\n текст[/u]"
alert( bbtagit(line) )

Попробуйте запустить. Заменяет? Как бы не так!

Дело в том, что в javascript мультилайн режим (флаг m) влияет только на символы ^ и $, которые начинают матчиться с началом и концом строки, а не всего текста.

Точка по-прежнему - любой символ, кроме новой строки. В javascript нет флага, который устанавливает мультилайн-режим для точки. Для того, чтобы заматчить совсем что угодно - используйте [\s\S].

Работающий вариант:

function bbtagit(text) {
  text = text.replace(/\[u\]([\s\S]*)\[\/u\]/gim, '<u>$1</u>')
 
  return text
}

var line = "[u]мой\n текст[/u]"
alert( bbtagit(line) )

Это не совсем особенность, скорее фича, но все же достойная отдельного абзаца.

Все регулярные выражения в javascript - жадные. То есть, выражение старается отхватить как можно больший кусок строки.

Например, мы хотим заменить все открывающие тэги <a>. На что и почему - не так важно.

text = '1 <A href="#">...</A> 2'
text = text.replace(/<A(.*)>/, 'TEST')
alert(text)

При запуске вы увидите, что заменяется не открывающий тэг, а вся ссылка, выражение матчит ее от начала и до конца.

Это происходит из-за того, что точка-звездочка в "жадном" режиме пытается захватить как можно больше, в нашем случае - это как раз до последнего >.

Последний символ > точка-звездочка не захватывает, т.к. иначе не будет совпадения.

Как вариант решения используют квадратные скобки: [^>]:

text = '1 <A href="#">...</A> 2'
text = text.replace(/<A([^>]*)>/, 'TEST')
alert(text)

Это работает. Но самым удобным вариантом является переключение точки-звездочки в нежадный режим. Это осуществляется простым добавлением знака "?" после звездочки.

В нежадном режиме точка-звездочка пустит поиск дальше сразу, как только нашла совпадение:

text = '1 <A href="#">...</A> 2'
text = text.replace(/<A(.*?)>/, 'TEST')
alert(text)

В некоторых языках программирования можно переключить жадность на уровне всего регулярного выражения, флагом.

В javascript это сделать нельзя.. Вот такая особенность. А вопросительный знак после звездочки рулит - честное слово.

Иногда нужно в самом паттерне поиска обратиться к предыдущей его части.

Например, при поиске BB-тагов, то есть строк вида [u]...[/u], [b]...[/b] и [s]...[/s]. Или при поиске атрибутов, которые могут быть в одинарных кавычках или двойных.

Обращение к предыдущей части паттерна в javascript осуществляется как \1, \2 и т.п., бэкслеш + номер скобочной группы:

text = ' [b]a [u]b[/u] c [/b] '

var reg = /\[([bus])\](.*?)\[\//*u*/\1/*/u*/\]/
text = text.replace(reg, '<$1>$2</$1>')
alert(text)

Обращение к скобочной группе в строке замены идет уже через доллар: $1. Не знаю, почему, наверное так удобнее..

P.S. Понятно, что при таком способе поиска bb-тагов придется пропустить текст через замену несколько раз - пока результат не перестанет отличаться от оригинала.

Эти две задачи решаются в javascript принципиально по-разному.

Начнем с "простого".

Для замены всех вхождений используется метод String#replace.
Он интересен тем, что допускает первый аргумент - регэксп или строку.

Если первый аргумент - строка, то будет осуществлен поиск подстроки, без преобразования в регулярное выражение.

Попробуйте:

alert("2 ++ 1".replace("+", "*"))

Каков результат? Как, заменился только один плюс, а не два? Да, вот так.

Чтобы заменить все вхождения, String#replace придется использовать в режиме регулярного выражения.

В режиме регулярного выражения плюс придется заэкранировать, но зато replace заменит все вхождения (при указании флага g):

alert("2 ++ 1".replace(/\+/g, "*"))

Вот такая особенность работы со строкой.

Очень полезной особенностью replace является возможность работать с функцией вместо строки замены. Такая функция получает первым аргументом - все совпадение, а последующими аргументами - скобочные группы.

Следующий пример произведет операции вычитания:

var str = "count 36 - 26, 18 - 9"
str = str.replace(/(\d+) - (\d+)/g, function(a,b,c) { return b-c })
alert(str)

В javascript нет одного универсального метода для поиска всех совпадений.
Для поиска без запоминания скобочных групп - можно использовать String#match:

var str = "count 36-26, 18-9"
var re =  /(\d+)-(\d+)/g
result = str.match(re)
for(var i=0; i<result.length; i++) alert(result[i])

Как видите, оно исправно ищет все совпадения (флаг 'g' у регулярного выражения обязателен), но при этом не запоминает скобочные группы. Эдакий "облегченный вариант".

В сколько-нибудь сложных задачах важны не только совпадения, но и скобочные группы. Чтобы их найти, предлагается использовать многократный вызов RegExp#exec.

Для этого регулярное выражение должно использовать флаг 'g'. Тогда результат поиска, запомненный в свойстве lastIndex объекта RegExp используется как точка отсчета для следующего поиска:

var str = "count 36-26, 18-9"
var re =  /(\d+)-(\d+)/g
var res
while ( (res = re.exec(str)) != null) {
  alert("Найдено " + res[0] + ":  ("+ res[1]+") и ("+res[2]+")")
  alert("Дальше ищу с позиции "+re.lastIndex)
}

Проверка while( (res = re.exec(str)) != null) нужна т.к. значение res = 0 является хорошим и означает, что вхождение найдено в самом начале строки (поиск успешен). Поэтому необходимо сравнивать именно с null.

Ну и напоследок - еще одна совсем оригинальная особенность регулярных выражений.

Вот - одна интересная функция.

Запустите ее один раз, запомните результат - и запустите еще раз.

function rere() {
    var re1 = /0/, re2 = new RegExp('0')
    alert([re1.foo, re2.foo])
    re1.foo = 1
    re2.foo = 1
}
rere()

В зависимости от браузера, результат первого запуска может отличаться от второго. На текущий момент, это так для Firefox, Opera. При этом в Internet Explorer все нормально.

С виду функция создает две локальные переменные и не зависит от каких-то внешних факторов.

Почему же разный результат?

Ответ кроется в стандарте ECMAScript, пункт 7.8.5:

Цитата...

A regular expression literal is an input element that is converted to a RegExp object (section 15.10)
when it is scanned. The object is created before evaluation of the containing program or function begins.
Evaluation of the literal produces a reference to that object; it does not create a new object.

То есть, простыми словами, литеральный регэксп не создается каждый раз при вызове var r = /regexp/.
Вместо этого браузер возвращает уже существующий объект, со всеми свойствами, оставшимися от предыдущего запуска.

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

Есть еще особенности?

Напишите в комментарии, и я добавлю их в статью.


Автор: Octane, дата: 18 января, 2010 - 19:17
#permalink

Наверное, стоит упомянуть о lastIndex, из-за которого иногда получаются вот такие, не совсем очевидные, ситуации:

var toLowerCamelCase = function () {
	var expr = /-([a-z])/g;
	return function(prop) {
		return expr.test(prop) ? prop.replace(expr, function () {
			return arguments[1].toUpperCase();
		}) : prop;
	};
}();

alert([
    toLowerCamelCase('background-image'),
    toLowerCamelCase('background-image'),
    toLowerCamelCase('background-image'),
    toLowerCamelCase('background-image')
].join("\n"));

Эффект можно наблюдать в IE и Chrome 4

backgroundImage
background-image
backgroundImage
background-image

Автор: with-love-from-..., дата: 24 февраля, 2011 - 14:20
#permalink

Приведенный Вами в примере

expr.test(prop)

аналогичен

expr.exec(prop) != null

со всеми вытекающими последствиями - будут обновляться свойства регэкспа (.lastIndex в том числе).

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

МСИЕ как раз ведет себя логично - многократное использование переменной в замыкании. А вот ФФ таки не логичен - с какой стати он реинициализирует переменную при каждом вызове функции?


Автор: Андрей Сидоров (не зарегистрирован), дата: 18 января, 2010 - 14:24
#permalink

регекспы яваскрипта позаимствовали синтаксис из перла, но реализовали только часть функционала. на сколько я знаю, своего они ничего не придумывали, и в таком случае скорее стоит говорить не об особенностях js-регекспов, а об их отличии от перловых.

а именно:

поддерживаются только три модификатора i,g,m
не поддерживаются модификаторы внутри регекспа (?i) (?-i)
не поддерживаются \A и \Z (начало и конец строки)
нет possessive quantifiers ?+ *+ ++
нет атомарной группировки (?>...)
нет lookbehind assertions (?<=...) (?...)
нет conditionals (?(condition)yes-pattern|no-pattern)
нет комментариев (?#comment)
нет рекурсивной конструкции (?R)

p.s. если не читали, рекомендую почитать книгу Фридла по регекспам - очень способствует пониманию регекспов.
http://www.amazon.com/Mastering-Regular-Expressions-Jeffrey-Friedl/dp/05...


Автор: Илья Кантор, дата: 18 января, 2010 - 18:35
#permalink

В этой статье описаны не отсутствующие фичи, по сравнению с перлом, а особенности.

То есть фичи и способы решения задач, которые ЕСТЬ, но работают ИНАЧЕ, чем мы привыкли видеть.


Автор: Rosya (не зарегистрирован), дата: 18 января, 2010 - 15:50
#permalink

Спасибо за рекомендации по поводу комментариев... Но дополнений и исправлений нет, есть только слова благодарности за такую информацию...


Автор: Regent, дата: 19 января, 2010 - 13:35
#permalink

.*? - действительно пробивная штука


Автор: anikey99, дата: 19 января, 2010 - 19:33
#permalink

вопрос почти в тему:
так как выражение replace в js работает только 1 раз -
как посчитать на странице количество bb тегов, в частности, ([url=ссылка]описание[/url] ), и если можно, как заменить такое выражение на желаемый мной текст?


Автор: B@rmaley.e><e, дата: 28 января, 2010 - 08:11
#permalink
var count = 0;
string.replace(/\[url=([^\]]+)\](.+?)\[\/url\]/ig, function($$, $1, $2){
  count++;
  return '<a href="' + $1 +'">' + $2 + '</a>';
});

Автор: Сашок (не зарегистрирован), дата: 25 января, 2010 - 13:03
#permalink

Да сложное дело java, а вы платную помощь не оказываете?


Автор: Илья Кантор, дата: 25 января, 2010 - 13:39
#permalink

Бесплатную оказываем. В форум.

P.S. При конкретной формулировке вопроса и адекватности спрашивающего.


Автор: anikey99, дата: 27 января, 2010 - 07:57
#permalink

помощь оказываем всякую, если надо что то конкретное написать обращайся


Автор: anikey99, дата: 27 января, 2010 - 07:57
#permalink

При конкретной формулировке вопроса и адекватности спрашивающего.

А что мой вопрос от 19 января, 2010 - 19:33 был не адекватен?


Автор: Илья Кантор, дата: 27 января, 2010 - 11:47
#permalink

Прочитайте статью еще раз, там появился раздел о поиске и замене. Надеюсь, он поможет в решении вашей задачи.


Автор: Гость (не зарегистрирован), дата: 19 февраля, 2010 - 21:09
#permalink

Подскажите, пожалуйста.
Делаю плагин autocomplete к jQuery. Не получается сделать проверку на вхождение и замену в строках с символами кириллицы.
Делаю так:

var re = new RegExp('\\b'+text,'gi');
if(re.search(str))
 str.replace(re,'<strong>$1</strong>');

где str — текст текущего элемент списка (в цикле обхожу все элементы),
text — это текст, содержащийся в поле ввода, т.е. подстрока.
С латиницей получается, с кириллицей — нет.


Автор: Гость (не зарегистрирован), дата: 19 февраля, 2010 - 21:14
#permalink

Ой, простите, перепутал немного.

if(str.search(re))

Автор: Гость (не зарегистрирован), дата: 20 февраля, 2010 - 08:22
#permalink

Нашёл примерчик регулярного выражения из готового плагина. Сработало! Объясните его, пожалуйста.

var re = new RegExp("(?![^&;]+;)(?!<[^<>]*)("+text+")(?![^<>]*>)(?![^&;]+;)",'gi');

Интересует само содержимое выражения.


Автор: viy.li, дата: 4 июня, 2012 - 22:21
#permalink

дайте ссылку на данный плагин пожалуйста


Автор: Гость (не зарегистрирован), дата: 5 октября, 2015 - 15:49
#permalink

\b ищет границу слов написанных только латиницей.


Автор: DmitryRegEx (не зарегистрирован), дата: 2 марта, 2010 - 20:29
#permalink

Подскажите как лучше решить задачу, если есть большой текст и надо произвести замену только одного вхождения подстроки, но при этом не первого (как будет без указания global), а последнего.
То есть, например есть строка "1xy2xy3xy4xy" и надо убрать последнее вхождение "xy", то есть получить "1xy2xy3xy4"
Подскажите, как это реализовать средствами javascript ?


Автор: Яростный Меч, дата: 12 апреля, 2010 - 14:00
#permalink

Воспользуемся жадностью
var result = '1xy2xy3xy4xy'.replace(/([\s\S]*)xy/m, function(a,b){return b;})


Автор: Гость (не зарегистрирован), дата: 19 июня, 2010 - 18:25
#permalink

можно вот эти слова перевести в java выражения?
привет
пока
как дела
пошол ты
здарова
что делаеш

Буду очень блогодарен


Автор: Гость (не зарегистрирован), дата: 20 июня, 2010 - 09:00
#permalink

Для удаления тега, например span можно написать так:
x=x.replace(/<(\/?)span([^>]*)>/ig,'')
от тега останется только то, что в нём, например от:
Содержимое
останется только "Содержимое"
А как убрать всё целиком и тег и его содержимое?


Автор: Slawaq, дата: 26 августа, 2010 - 01:42
#permalink

то что искал 3 дня по бб кодам, только не давно начал работать с регами из-за это-го плохо понимал, статья супер, примеры идеальны


Автор: Гость (не зарегистрирован), дата: 19 ноября, 2010 - 15:27
#permalink

вы юзаете /i, /gi и т.п., но ничего о них не пишете
вы не находите что неплохо бы добавить их описание ?
или для них здесь есть отдельная страничка ? - тогда киньте ссылку


Автор: B@rmaley.e><e, дата: 20 ноября, 2010 - 08:52
#permalink

Автор: Гость (не зарегистрирован), дата: 18 января, 2011 - 23:41
#permalink

Найти все со скобками

Там у вас пример странный, вот например в Вашем же случае все скобочки найти можно просто: "count 36-26, 18-9".match( /(\d+)-(\d+)/g ) и вернется массив из найденых вхождений, в данном случае 2 элемента, почему Вы привели именно такой пример?


Автор: Гость (не зарегистрирован), дата: 4 ноября, 2011 - 00:40
#permalink

"...Чтобы их найти, предлагается использовать многократный вызов RegExp#exec."

Мне кажется тут говорится, что поиск всех "скобок" должен происходить в цикле, т.к. ".match" вернет только первое вхождение.


Автор: Гость (не зарегистрирован), дата: 21 января, 2011 - 09:03
#permalink

Объясните пожалуйста, как в маску передать переменную - строку.
Заранее спасибо за ответ.


Автор: Гость (не зарегистрирован), дата: 15 февраля, 2011 - 11:49
#permalink

var reg=new RegExp(varstring);


Автор: max7 (не зарегистрирован), дата: 31 января, 2011 - 20:12
#permalink

А как вам это (почти как String.prototype.replace)

RegExp.prototype.reset = function() 
 { 
    this.lastIndex = 0;
    return this;
 };   

 RegExp.prototype.forEach = function(str, fun, scope) 
 { 
    this.reset();
    for(var res = null; (res = this.exec(str)) != null;)
       if(fun.apply(scope, res) === false)
          break;
    return this;
 };

Автор: edd_k, дата: 19 марта, 2011 - 16:49
#permalink

>> Это не совсем особенность, скорее фича, но все же достойная отдельного абзаца.

Нежадный "?" - это не фича js-а. Эту возможность давно поддерживают и php, и perl наверное, и микрософтовская реализация регулярок.


Автор: Гость (не зарегистрирован), дата: 14 апреля, 2011 - 18:07
#permalink

Как можно заполнить массив найдеными числами. Делаю

var re =  /\d+/g
	var res
	while ( (res = re.exec(str)) != null) {
	  ar[i] = res[i];
	  alert(res[i]);
	  i++;
	}

Не получается, заполняется только первый элемент?


Автор: ShpuntiK (не зарегистрирован), дата: 10 августа, 2011 - 17:49
#permalink
var str = "sdfsd23321 3asdfds 23-023 sdaf12d2d201m21"; //например такая строка
var arr = [];
arr = str.match(/\d+/g); // возьмём match и он сразу сам в массив всё запишет
for (var i=0; i < arr.length; i++){  // и выводим для проверки
    alert(arr[i]);
};

Автор: Гость (не зарегистрирован), дата: 21 апреля, 2011 - 16:37
#permalink
var re =  /\d+/g
	var res
	var ar = new Array();
	while ( (res = re.exec(str)) != null) {
	  ar.push(res[i]);
	  alert(res[i]); //добавляемый элемент массива
	  i++;
	}
	alert(ar); //показать массив с найденными числами

Автор: Гость (не зарегистрирован), дата: 2 октября, 2011 - 07:08
#permalink

подправьте секцию "статические свойства" у меня кнопка "запустить" на однострочном коде выдаёт
rere() is not defined

firefox 6.0.2


Автор: Gozar, дата: 26 октября, 2011 - 20:21
#permalink

Тогда уж заодно и поправить, что результат одинаковый и в FF7 и Opera11.51.
Пофиксили поведение.


Автор: Гость (не зарегистрирован), дата: 3 ноября, 2011 - 14:25
#permalink

Доброго времени суток.
Задача: заменить все двойные кавычки " в строке на пробелы, если они не являются частью выражения ";". Пытался так
var pattern = /"(?!;")/g;
var new_str = str.replace(pattern," ");
но данный вариант,удаляя кавычки, от ";" оставляет ";
Буду благодарен за помощь.


Автор: Гость (не зарегистрирован), дата: 4 ноября, 2011 - 01:23
#permalink

Все верно, ваше выражение /"(?!;")/ находит кавычку, если за ней не следует точка с запятой. В выражении ";" под этот поиск как раз попадает вторая кавычка, ведь за ней нет точки с запятой.


Автор: vexdex (не зарегистрирован), дата: 7 ноября, 2011 - 01:08
#permalink

Привет.
Прошу помощи - поиск и замена накладываются при повторном применении....

param = "p2 and s3"
param.replace(/p/g,"models.price=").replace(/s/g,"models.season_ID=")

приводит к
modelmodels.season_ID=.price=2

и как быть, если надо
model.price=2 and models.season_ID=3
?


Автор: Caleb, дата: 17 апреля, 2012 - 13:42
#permalink

Можно предварительно заменить искомые подстроки на заведомо уникальные, а потом заменять уже эти уникальные на то, что надо. Например так:

param = "p2 and s3"
param
.replace(/p/g,"SOME_UNIQ_TEXT_1")
.replace(/s/g,"SOME_UNIQ_TEXT_2")
.replace(/SOME_UNIQ_TEXT_1/g,"models.price=")
.replace(/SOME_UNIQ_TEXT_2/g,"models.season_ID=")

В качестве замедомо уникальных строк (SOME_UNIQ_TEXT_1) можно использовать например COM GUID или MD5 хеш от текущего времени и еще чего-нибудь (стопроцентной гарантии уникальности конечно нет, но для данной задачи подойдет).


Автор: up2beer (не зарегистрирован), дата: 21 апреля, 2012 - 07:34
#permalink

думай что пишешь! md5 блин....
уникальность можно получить банальным счетчиком

var string = 'some strings', z=0;
string.replace(/s/g, function() {return z++;});

и чтоб не было пересекающихся замен - делать замены одним выражением:

var param = "p2 and s3";
param.replace(/([sp])/g, function(i, r) {
    if (r == 's') return 'models.season_ID=';
    if (r == 'p') return 'models.price='
});

Автор: Invis1ble, дата: 18 мая, 2012 - 04:30
#permalink

rere() is not defined
Chromium 18


Автор: oneguy, дата: 5 июня, 2012 - 22:51
#permalink

По поводу статических свойств регулярных выражений:
В 5-ом ECMAScript эту "фичу" уже убрали - теперь при каждом выполнении литерала регулярного выражения создаётся новый объект RegExp.


Автор: Гость (не зарегистрирован), дата: 30 июля, 2012 - 16:50
#permalink

Привет всем. Очень нужна помощь. Есть строка вида text.text.text - curr
в результате выполнения

/^([^\.]*)(\.?(.*)$|$)/.exec(curr);

получается

RegExp.$1
"text"
>>> RegExp.$2
".text.text"
>>> RegExp.$3
"text.text"

Беда в том, что в тексте может быть конструкция вида '/.' которая должна вопсприниматься как текст (text) и вести себя так же. Т.е. регулярка не должна срабатывать по точке если перед точкой есть '/'. Помогите пожалуйста. Вообще не могу придумать как это оформить


Автор: Гость (не зарегистрирован), дата: 28 января, 2013 - 10:55
#permalink

Доброго времени суток, уважаемые специалисты.
Впервые столкнулся с регэкспами... Пока обходился без него, но жизнь заставила).
Не могу сформировать шиблон для задачи:
Нужно проверить, подходит ли строка под шаблон ЧИСЛО.ЧИСЛО
На данный момент додумался вот до этого:

function CheckChain(Chain){
var validRegExp = /^(([0-9\-])+\.)+([0-9]{1,2})+$/;
var rslt = Chain.match(validRegExp);
return rslt;}

Работает, но есть 2 НО:
1) ошибка при выполнении, если Chain=Null (не оч. критично)
2) под шаблон попадаюn также значения типа ЧИСЛО.ЧИСЛО.ЧИСЛО.ЧИСЛО (1.2.17.56), что неправильно.
Подскажите, пожалуйста, где я не прав, и как должен выглядеть шаблон. Буду благодарен за пояснения.
Заранее благодарю всех откликнувшихся.


Автор: Гость (не зарегистрирован), дата: 4 июля, 2013 - 21:25
#permalink

"число.число.число" подходит, поскольку так разрешено:
сначала разрешается сочетание "число.число.": (([0-9\-])+\.)+ , т.е. один или несколько символов, являющихся числом или "-", за которыми обязательно стоит точка, и это сочетание повторяется один или несколько раз (т.е. 93.45.28234284. - это норм.),
а следом требуете еще число: ([0-9]{1,2})+, т.е. одна или две цифры, повторяющиеся один или несколько раз,
в итоге "число.число.число" вполне подходит, точно также, как что-нибудь вроде этого: --9273---38-328-----.-----.344598452378274339

если нужно, чтоб строка соответствовала шаблону "число.число" и ничего кроме этой последовательности не содержала, то: /^[0-9]+\.[0-9]+$/
если в качестве первого допускается любое, а в качестве второго только однозначное или двузначное число, тогда так: /^[0-9]+\.[0-9]{1,2}$/
если при этом нужно запомнить только цифры, то: /^([0-9]+)\.([0-9]{1,2})$/


Автор: Глеб Иваницкий (не зарегистрирован), дата: 27 мая, 2013 - 15:10
#permalink

А как сделать так, чтобы я нажал на текст и открылось такое окно, но с моим текстом?


Автор: demoniqus, дата: 17 августа, 2013 - 08:03
#permalink

Если я не ошибаюсь, то в разделе "Точка и перенос строки" допущена ошибка во второй регулярке.
/\[u\](.*?)\[\/u\]/gim - здесь установлен нежадный поиск
/\[u\]([\s\S]*)\[\/u\]/gim - а вот тут забыли этот нежадный поиск установить и в результате получится инфаркт для чайника))) Правильно будет /\[u\]([\s\S]*?)\[\/u\]/gim


Автор: Гость (не зарегистрирован), дата: 4 октября, 2013 - 16:45
#permalink

Здравствуйте.
Столкнулся с проблемой, не работает правильно регулярное выражение.

Есть строка page/:cat/:name/sort/:subcat/my/:id
Мне нужно из неё получить код между ":" и "/"
Пробую так:

var str = "page/:cat/:name/sort/:subcat/my/:id";
 var myA;
  if((myA = /:(\w+)+/gi.exec(str)) != null) {
                  console.log(myA);
  }

Но, этот код возвращает только первое совпадение "cat", а нужно что бы вернуло все: cat, name, subcat, id


Автор: Гость (не зарегистрирован), дата: 4 октября, 2013 - 17:27
#permalink

Решил проблему, нужно было циклом пройтись.
Вот возможно кому-то понадобится:

var str = "page/:cat/:name/sort/:subcat/my/:id";
var myA;
var re =  /:(\w+)/gi
while((myA = re.exec(key)) != null) {
    console.log(myA[1]);
}

Автор: Гость (не зарегистрирован), дата: 4 октября, 2013 - 17:30
#permalink

Точнее:

var str = "page/:cat/:name/sort/:subcat/my/:id";
var myA;
var re =  /:(\w+)/gi
while((myA = re.exec(str)) != null) {
    console.log(myA[1]);
}

Опечатался


Автор: Suvorov (не зарегистрирован), дата: 27 марта, 2014 - 16:59
#permalink

Уважаемая администрация, код не запускается.

function rere() {
var re1 = /0/, re2 = new RegExp('0')
alert([re1.foo, re2.foo])
re1.foo = 1
re2.foo = 1
}
rere()

К тому же, в FF он работает нормально.


Автор: Гость (не зарегистрирован), дата: 27 августа, 2014 - 13:25
#permalink

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


Автор: Василий Степанович (не зарегистрирован), дата: 26 марта, 2015 - 20:42
#permalink

> str = str.replace(/(\d+) - (\d+)/g, function(a,b,c) { return b-c })

А почему здесь в регулярном выражении - 2 аргумента - (\d+) и (\d+),
а в функции 3 аргумента - a, b, c?


Автор: Гость (не зарегистрирован), дата: 26 марта, 2015 - 20:44
#permalink

Прошу прощения. Ответ нашёл в описании:
> Первый параметр всегда содержит полную совпавшую подстроку


Автор: Гость (не зарегистрирован), дата: 4 октября, 2018 - 12:44
#permalink

Материал полезный, еще можно почитать статьи по связанным темам.


Автор: osama skh (не зарегистрирован), дата: 1 февраля, 2020 - 14:32
#permalink

If you set out to make me think today; mission accomplished! I really like your writing style and how you express your ideas. Thank you.


Автор: john johnss (не зарегистрирован), дата: 6 февраля, 2020 - 20:00
#permalink

You know your projects stand out of the herd. There is something special about them. It seems to me all of them are really brilliant!
The Fancy Voyager


Автор: Naomi (не зарегистрирован), дата: 15 февраля, 2020 - 10:00
#permalink

Продолжайте в том же духе ваш блог очень красивый и полезный.
John


Автор: johnb6 (не зарегистрирован), дата: 23 февраля, 2020 - 14:43
#permalink

I can see that you are an expert at your field! I am launching a website soon, and your information will be very useful for me.. Thanks for all your help and wishing you all the success in your business.
Wasps Nest Removal


Автор: johnb (не зарегистрирован), дата: 28 февраля, 2020 - 22:10
#permalink

Awesome blog. I enjoyed reading your articles. This is truly a great read for me. I have bookmarked it and I am looking forward to reading new articles. Keep up the good work!
movie leather jackets


Автор: johnb (не зарегистрирован), дата: 29 февраля, 2020 - 22:49
#permalink

This is such a great resource that you are providing and you give it away for free. I love seeing blog that understand the value of providing a quality resource for free.
Kad3D


Автор: johnaab (не зарегистрирован), дата: 3 марта, 2020 - 00:08
#permalink

I haven’t any word to appreciate this post.....Really i am impressed from this post....the person who create this post it was a great human..thanks for shared this with us.
window glass


Автор: osama shk (не зарегистрирован), дата: 7 марта, 2020 - 10:59
#permalink

Awesome blog. I enjoyed reading your articles. This is truly a great read for me. I have bookmarked it and I am looking forward to reading new articles. Keep up the good work!
婚約指輪 福岡


Автор: john bond (не зарегистрирован), дата: 12 марта, 2020 - 13:15
#permalink

Awesome blog. I enjoyed reading your articles. This is truly a great read for me. I have bookmarked it and I am looking forward to reading new articles. Keep up the good work!
p405 training


Автор: john bond (не зарегистрирован), дата: 14 марта, 2020 - 10:48
#permalink

This is highly information, crisp and clear. I think that everything has been described in systematic manner so that reader could get maximum information and learn many things.
https://beone.vn/bot-ngu-coc-la-gi/


Автор: johnb (не зарегистрирован), дата: 14 марта, 2020 - 13:17
#permalink

I was reading your article and wondered if you had considered creating an ebook on this subject. Your writing would sell it fast. You have a lot of writing talent.
Top Wireless Thermometer Hygrometers


Автор: osama shk (не зарегистрирован), дата: 16 марта, 2020 - 13:40
#permalink

You have done a great job on this article. It’s very readable and highly intelligent. You have even managed to make it understandable and easy to read. You have some real writing talent. Thank you.
anti rayap jakarta


Автор: osama shk (не зарегистрирован), дата: 19 марта, 2020 - 12:43
#permalink

i am for the first time here. I found this board and I in finding It truly helpful & it helped me out a lot. I hope to present something back and help others such as you helped me.
婚約指輪 猫


Автор: john bond (не зарегистрирован), дата: 21 марта, 2020 - 14:06
#permalink

This is my first time visit here. From the tons of comments on your articles,I guess I am not only one having all the enjoyment right here!
Best Solar Installers Oakland


Автор: john bond (не зарегистрирован), дата: 21 марта, 2020 - 18:12
#permalink

Wow, cool post. I’d like to write like this too – taking time and real hard work to make a great article… but I put things off too much and never seem to get started. Thanks though.
paving contractors


Автор: osama shk (не зарегистрирован), дата: 22 марта, 2020 - 19:35
#permalink

You completed a few fine points there. I did a search on the subject and found nearly all persons will go along with with your blog.
ハワイアンジュエリー 結婚指輪


Автор: muneer ahmed (не зарегистрирован), дата: 23 марта, 2020 - 12:20
#permalink

This is a wonderful article, Given so much info in it, These type of articles keeps the users interest in the website, and keep on sharing more ... good luck. https://royalcbd.com/product/cbd-oil-2500mg/


Автор: john bond (не зарегистрирован), дата: 23 марта, 2020 - 13:55
#permalink

I really like your take on the issue. I now have a clear idea on what this matter is all about..
páciensek és fogorvosok kedvence


Автор: john bond (не зарегистрирован), дата: 23 марта, 2020 - 20:29
#permalink

I just couldn't leave your website before telling you that I truly enjoyed the top quality info you present to your visitors? Will be back again frequently to check up on new posts.
PHD barbers


Автор: osama shk (не зарегистрирован), дата: 23 марта, 2020 - 21:35
#permalink

If you set out to make me think today; mission accomplished! I really like your writing style and how you express your ideas. Thank you.
婚約指輪 福岡


Автор: Гость (не зарегистрирован), дата: 26 марта, 2020 - 12:40
#permalink

Your work is very good and I appreciate you and hopping for some more informative posts. Thank you for sharing great information to us.
flowchart maker


Автор: johnsa (не зарегистрирован), дата: 26 марта, 2020 - 12:55
#permalink

Thanks so much for this information. I have to let you know I concur on several of the points you make here and others may require some further review, but I can see your viewpoint.
Best Air Fryers


Автор: john bond (не зарегистрирован), дата: 27 марта, 2020 - 15:09
#permalink

Interesting post. I Have Been wondering about this issue, so thanks for posting. Pretty cool post.It 's really very nice and Useful post.Thanks
medicine for your lungs


Автор: john bond (не зарегистрирован), дата: 29 марта, 2020 - 11:02
#permalink

I am very enjoyed for this blog. Its an informative topic. It help me very much to solve some problems. Its opportunity are so fantastic and working style so speedy.
website design quotes


Автор: muneer ahmed (не зарегистрирован), дата: 29 марта, 2020 - 20:17
#permalink

This is my first time visit to your blog and I am very interested in the articles that you serve. Provide enough knowledge for me. Thank you for sharing useful and don't forget, keep sharing useful info: https://royalcbd.com/product/cbd-oil-1000mg/


Автор: muneer ahmed (не зарегистрирован), дата: 30 марта, 2020 - 20:43
#permalink

I am all that much satisfied with the substance you have specified. I needed to thank you for this extraordinary article. https://royalcbd.com/product/cbd-oil-500mg/


Автор: john bond (не зарегистрирован), дата: 31 марта, 2020 - 12:12
#permalink

I am very much pleased with the contents you have mentioned. I wanted to thank you for this great article.
sports bars near me


Автор: muneer ahmed (не зарегистрирован), дата: 2 апреля, 2020 - 18:42
#permalink

It was extremely all around composed and straightforward. Not at all like different online journals I have perused which are truly not that good.Thanks a lot https://royalcbd.com/product/cbd-oil-250mg/


Автор: muneer ahmed (не зарегистрирован), дата: 2 апреля, 2020 - 18:57
#permalink

Visit our site to find more about wedding photographer Northern Virginia. We offer engagement and proposal photography in Va. https://royalcbd.com/product/cbd-gummies-10mg/


Автор: muneer ahmed (не зарегистрирован), дата: 2 апреля, 2020 - 19:10
#permalink

Particular interviews furnish firsthand message on mart size, industry trends, ontogeny trends, capitalist landscape and outlook, etc. https://royalcbd.com/product/cbd-gummies-25mg/


Автор: muneer ahmed (не зарегистрирован), дата: 2 апреля, 2020 - 19:38
#permalink

I am extremely delighted in for this web journal. Its a useful subject. It help me all that much to take care of a few issues. Its chance are so awesome and working style so rapid. https://royalcbd.com/product/cbd-capsules-25mg/


Автор: muneer ahmed (не зарегистрирован), дата: 2 апреля, 2020 - 19:45
#permalink

I am all that much satisfied with the substance you have specified. I needed to thank you for this extraordinary article. https://royalcbd.com/product/cbd-roll-on-gel/


Автор: muneer ahmed (не зарегистрирован), дата: 2 апреля, 2020 - 19:57
#permalink

This is my first time visit to your blog and I am very interested in the articles that you serve. Provide enough knowledge for me. Thank you for sharing useful and don't forget, keep sharing useful info: https://royalcbd.com/product/cbd-salve/


Автор: muneer ahmed (не зарегистрирован), дата: 2 апреля, 2020 - 20:07
#permalink

Most of the time I don’t make comments on websites, but I'd like to say that this article really forced me to do so. Really nice post! https://royalcbd.com/shop/


Автор: muneer ahmed (не зарегистрирован), дата: 2 апреля, 2020 - 20:14
#permalink

Intriguing post. I Have Been pondering about this issue, so much obliged for posting. Really cool post.It "s truly extremely pleasant and Useful post.Thanks https://royalcbd.com/


Автор: muneer ahmed (не зарегистрирован), дата: 2 апреля, 2020 - 20:26
#permalink

Waow this is quite pleasant article, my sister love to read such type of post, I am going to tell her and bookmarking this webpage. Thanks https://royalcbd.com/blog/


Автор: peved (не зарегистрирован), дата: 3 апреля, 2020 - 11:47
#permalink

I really enjoyed reading this post, big fan. Keep up the good work and please tell me when can you publish more articles or where can I read more on the subject?
Barbados Website Design


Автор: pevedob (не зарегистрирован), дата: 4 апреля, 2020 - 18:51
#permalink

I really impressed after read this because of some quality work and informative thoughts . I just wanna say thanks for the writer and wish you all the best for coming!.
Vegan French Toast Recipes


Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
9 + 9 =
Введите результат. Например, для 1+3, введите 4.
 
Текущий раздел
Поиск по сайту
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Последние комментарии
Последние темы на форуме
Forum