Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Регулярное выражение. Незапоминающие скобки. (https://javascript.ru/forum/misc/44644-regulyarnoe-vyrazhenie-nezapominayushhie-skobki.html)

s_drud 27.01.2014 21:27

Регулярное выражение. Незапоминающие скобки.
 
Всех приветствую. Подскажите пожалуйста по поводу регулярных выражений, а конкретно по незапоминающим скобкам (?:)
Они не работают. При поиске по строке, содержимое скобок всё равно попадает в вывод. Может я что-то неправильно делаю или вообще не понимаю, подскажите кто разбирается.
Пример может быть любой банальный:
str = "javascript.ru/forum";
newstr = str.match(/\.(?:r)u/gi);
alert(newstr);

получаем на выходе .ru вместо .u //Пичаль...

ksa 28.01.2014 10:49

Цитата:

Сообщение от 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-'));

s_drud 28.01.2014 12:59

ksa, спасибо за ответ.
Т.е. не запоминают скобки только в массив результатов?
Ведь в следующем примере алерты одинаковое значение возвращают, т.е. здесь они не действуют.
var str = "1234567890";
var newstr = str.match(/(?:34)/gi);
alert(newstr);
newstr = str.match(/(34)/gi);
alert(newstr);

рони 28.01.2014 13:15

если надо
Цитата:

Сообщение от s_drud
.u

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]);

s_drud 28.01.2014 15:45

рони, спасибо.
В таком случае можно и запоминающие скобки использовать, просто не выводить в результат n-й, не нужный мне элемент массива совпадений. Это тоже интересный вариант.

ksa 28.01.2014 15:47

Цитата:

Сообщение от s_drud (Сообщение 294527)
Т.е. не запоминают скобки только в массив результатов?

Да. :yes:

Цитата:

Сообщение от s_drud (Сообщение 294527)
Ведь в следующем примере алерты одинаковое значение возвращают, т.е. здесь они не действуют.
var str = "1234567890";
var newstr = str.match(/(?:34)/gi);
alert(newstr);
newstr = str.match(/(34)/gi);
alert(newstr);

Они действуют как скобки.
В твоем примере их разницы не видно, как, например, в моем примере...

Вопрос в том, что ты хочешь получить от регулярного выражения? :blink:

Может уже пора перестать насиловать те скобки? :D

s_drud 28.01.2014 17:05

Как мне показывали, в VBS незапоминающие скобки реально не запоминают:)
Нужно выделить из строки нужный кусок. Строка вида: (какое-то начало строки)(НУЖНЫЙ КУСОК)(известное условие конца куска).
Сейчас мне приходится выделять (какое-то начало строки)(НУЖНЫЙ КУСОК), а потом (какое-то начало строки) реплейсить в ничто. Хотелось незапоминающих скобок и выделять нужный кусок в один проход без лишних телодвижений.

И ещё, я заметил что если спользовать флаг g, то из массива результатов ничего вывести уже не получается.

ksa 29.01.2014 08:39

Цитата:

Сообщение от 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-выражение (исключение см.выше).

s_drud 30.01.2014 10:49

спасибо ещё раз. прояснил для себя некоторые моменты.


Часовой пояс GMT +3, время: 19:40.