 
			
				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,298
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от 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,150
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		если надо  
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,298
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	
		
			Сообщение от 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,298
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от 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
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 спасибо ещё раз. прояснил для себя некоторые моменты. 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
 
 
 
 
 
	 | 
 
 
 |