Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 27.01.2014, 21:27
Новичок на форуме
Отправить личное сообщение для s_drud Посмотреть профиль Найти все сообщения от s_drud
 
Регистрация: 27.09.2013
Сообщений: 5

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

получаем на выходе .ru вместо .u //Пичаль...
Ответить с цитированием
  #2 (permalink)  
Старый 28.01.2014, 10:49
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 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-'));
Ответить с цитированием
  #3 (permalink)  
Старый 28.01.2014, 12:59
Новичок на форуме
Отправить личное сообщение для s_drud Посмотреть профиль Найти все сообщения от s_drud
 
Регистрация: 27.09.2013
Сообщений: 5

ksa, спасибо за ответ.
Т.е. не запоминают скобки только в массив результатов?
Ведь в следующем примере алерты одинаковое значение возвращают, т.е. здесь они не действуют.
var str = "1234567890";
var newstr = str.match(/(?:34)/gi);
alert(newstr);
newstr = str.match(/(34)/gi);
alert(newstr);
Ответить с цитированием
  #4 (permalink)  
Старый 28.01.2014, 13:15
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,123

если надо
Сообщение от 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]);

Последний раз редактировалось рони, 28.01.2014 в 13:19.
Ответить с цитированием
  #5 (permalink)  
Старый 28.01.2014, 15:45
Новичок на форуме
Отправить личное сообщение для s_drud Посмотреть профиль Найти все сообщения от s_drud
 
Регистрация: 27.09.2013
Сообщений: 5

рони, спасибо.
В таком случае можно и запоминающие скобки использовать, просто не выводить в результат n-й, не нужный мне элемент массива совпадений. Это тоже интересный вариант.
Ответить с цитированием
  #6 (permalink)  
Старый 28.01.2014, 15:47
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 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);
Они действуют как скобки.
В твоем примере их разницы не видно, как, например, в моем примере...

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

Может уже пора перестать насиловать те скобки?
Ответить с цитированием
  #7 (permalink)  
Старый 28.01.2014, 17:05
Новичок на форуме
Отправить личное сообщение для s_drud Посмотреть профиль Найти все сообщения от s_drud
 
Регистрация: 27.09.2013
Сообщений: 5

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

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

Последний раз редактировалось s_drud, 28.01.2014 в 17:27.
Ответить с цитированием
  #8 (permalink)  
Старый 29.01.2014, 08:39
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 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-выражение (исключение см.выше).
Ответить с цитированием
  #9 (permalink)  
Старый 30.01.2014, 10:49
Новичок на форуме
Отправить личное сообщение для s_drud Посмотреть профиль Найти все сообщения от s_drud
 
Регистрация: 27.09.2013
Сообщений: 5

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Регулярное выражение и метод test tsigel Общие вопросы Javascript 3 30.08.2013 13:47
регулярное выражение literator Ваши сайты и скрипты 1 18.08.2013 18:24
регулярное выражение martinss jQuery 5 29.07.2011 12:46
Регулярное выражение: любой символ, включая перевод строки Gleb Общие вопросы Javascript 3 28.07.2011 12:15
регулярное выражение theo_ Общие вопросы Javascript 15 21.06.2010 10:29