27.01.2014, 21:27
|
Новичок на форуме
|
|
Регистрация: 27.09.2013
Сообщений: 5
|
|
Регулярное выражение. Незапоминающие скобки.
Всех приветствую. Подскажите пожалуйста по поводу регулярных выражений, а конкретно по незапоминающим скобкам (?
Они не работают. При поиске по строке, содержимое скобок всё равно попадает в вывод. Может я что-то неправильно делаю или вообще не понимаю, подскажите кто разбирается.
Пример может быть любой банальный:
str = "javascript.ru/forum";
newstr = str.match(/\.(?:r)u/gi);
alert(newstr);
получаем на выходе .ru вместо .u //Пичаль...
|
|
28.01.2014, 10:49
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,227
|
|
Сообщение от s_drud
|
Они не работают.
|
Таки работают.
Сообщение от s_drud
|
или вообще не понимаю
|
Скорее всего...
Сообщение от s_drud
|
подскажите кто разбирается
|
Обратимся к первоисточнику...
Цитата:
|
(x)
Находит x и запоминает. Это называется "запоминающие скобки". Например, /(foo)/ найдет и запомнит 'foo' в "foo bar." Найденная подстрока хранится в массиве-результате поиска или в предопределенных свойствах объекта RegExp: $1, ..., $9.Кроме того, скобки объединяют то, что в них находится, в единый элемент паттерна. Например, (abc)* - повторение abc 0 и более раз.
|
Цитата:
|
(?:x)
Находит x, но не запоминает найденное. Это называется "незапоминающие скобки". Найденная подстрока не сохраняется в массиве результатов и свойствах RegExp.Как и все скобки, объединяют находящееся в них в единый подпаттерн.
|
http://javascript.ru/RegExp
Т.е. это те же скобки, только (х) "Найденная подстрока хранится в массиве-результате поиска или в предопределенных свойствах объекта RegExp: $1, ..., $9."
При использовании (?:х) "Найденная подстрока не сохраняется в массиве результатов и свойствах RegExp."
Вот некая иллюстрация разницы
var str = "1234567890";
var newstr = str.match(/(?:34)/gi);
alert(newstr);
newstr = str.match(/(34)/gi);
alert(newstr);
alert(str.replace(/(34)/gi,'-$1-'));
alert(str.replace(/(?:34)/gi,'-$1-'));
|
|
28.01.2014, 12:59
|
Новичок на форуме
|
|
Регистрация: 27.09.2013
Сообщений: 5
|
|
ksa, спасибо за ответ.
Т.е. не запоминают скобки только в массив результатов?
Ведь в следующем примере алерты одинаковое значение возвращают, т.е. здесь они не действуют.
var str = "1234567890";
var newstr = str.match(/(?:34)/gi);
alert(newstr);
newstr = str.match(/(34)/gi);
alert(newstr);
|
|
28.01.2014, 13:15
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,123
|
|
если надо
str = "javascript.ru/forum";
regexp = /(\.)(?:r)(u)/;
newstr = str.match(regexp);
alert(newstr[1]+newstr[2]);
однако r незапомнилось между 1 и 2
str = "javascript.ru/forum";
regexp = /(\.)(r)(u)/;
newstr = str.match(regexp);
alert(newstr[1]+newstr[2]);
Последний раз редактировалось рони, 28.01.2014 в 13:19.
|
|
28.01.2014, 15:45
|
Новичок на форуме
|
|
Регистрация: 27.09.2013
Сообщений: 5
|
|
рони, спасибо.
В таком случае можно и запоминающие скобки использовать, просто не выводить в результат n-й, не нужный мне элемент массива совпадений. Это тоже интересный вариант.
|
|
28.01.2014, 15:47
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,227
|
|
Сообщение от s_drud
|
Т.е. не запоминают скобки только в массив результатов?
|
Да.
Сообщение от s_drud
|
Ведь в следующем примере алерты одинаковое значение возвращают, т.е. здесь они не действуют.
var str = "1234567890";
var newstr = str.match(/(?:34)/gi);
alert(newstr);
newstr = str.match(/(34)/gi);
alert(newstr);
|
Они действуют как скобки.
В твоем примере их разницы не видно, как, например, в моем примере...
Вопрос в том, что ты хочешь получить от регулярного выражения?
Может уже пора перестать насиловать те скобки?
|
|
28.01.2014, 17:05
|
Новичок на форуме
|
|
Регистрация: 27.09.2013
Сообщений: 5
|
|
Как мне показывали, в VBS незапоминающие скобки реально не запоминают
Нужно выделить из строки нужный кусок. Строка вида: (какое-то начало строки)(НУЖНЫЙ КУСОК)(известное условие конца куска).
Сейчас мне приходится выделять (какое-то начало строки)(НУЖНЫЙ КУСОК), а потом (какое-то начало строки) реплейсить в ничто. Хотелось незапоминающих скобок и выделять нужный кусок в один проход без лишних телодвижений.
И ещё, я заметил что если спользовать флаг g, то из массива результатов ничего вывести уже не получается.
Последний раз редактировалось s_drud, 28.01.2014 в 17:27.
|
|
29.01.2014, 08:39
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,227
|
|
Сообщение от s_drud
|
Как мне показывали, в VBS незапоминающие скобки реально не запоминают
|
Х/з как в ВБС... Но тут что-то незапоминает только
Цитата:
|
x(?=y)
Находит x, только если за x следует y. Например, /Jack(?=Sprat)/ найдет 'Jack', только если за ним следует 'Sprat'. /Jack(?=Sprat|Frost)/ найдет 'Jack', только если за ним следует 'Sprat' или 'Frost'. Однако, ни 'Sprat' ни 'Frost' не войдут в результат поиска.
|
http://javascript.ru/RegExp
Т.е. "массив результатов и свойства RegExp" не есть "результат поиска"... Результатом поиска выступает все RegExp-выражение (исключение см.выше).
|
|
30.01.2014, 10:49
|
Новичок на форуме
|
|
Регистрация: 27.09.2013
Сообщений: 5
|
|
спасибо ещё раз. прояснил для себя некоторые моменты.
|
|
|
|