| 
							vika
							
						 | 
						
							
								  | 
								
									
									 «  : 13-08-2012 18:43 »   | 
								
								 | 
							  
							 
							Здравствуйте. Вот никак понять не могу, как правильно обозначить подшаблон в шаблоне. То бишь, вот этот код не робит совсем, хотя отдельно куски могу вытащить #!/usr/bin/perl -w
  $| = 1;
  my $test = <<"EOF"; <table cellspacing="0" cellpadding="3" border="0" align="center" width="100%"> EOF
  $test =~ m/cellspacing="(\d)\D+width="(\d+[^\"]+)/;
  print $1;
  print $2;
 
   
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							Dimka
							
								Деятель 
								Команда клуба
								
								 
								  Offline
								Пол:   
								
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #1 : 13-08-2012 19:24 »   | 
								
								 | 
							  
							 
							vika, а я вообще этого кода не пойму. Чего ищется? Парсинг атрибутов будет примерно так: /cellspacing="(\d*)"\s+.*width="(\d+.*)?"/  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел) 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							RXL
							
						 | 
						
							
								  | 
								
									
									 « Ответ #2 : 13-08-2012 21:09 »   | 
								
								 | 
							  
							 
							Согласен: задачу нужно описывать, а не вываливать свои потуги.
  Дим, кстати, твое выражение с изъяном и "?" не понятно к чему. Сдается, ты скобку рано поставил. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							Dimka
							
								Деятель 
								Команда клуба
								
								 
								  Offline
								Пол:   
								
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #3 : 14-08-2012 05:33 »   | 
								
								 | 
							  
							 
							RXL, ко второй группе. Другое дело, что по принципу жадного алгоритма .* во второй группе отхватит не содержимое кавычек после width, а кусок от начальной кавычки width до самой последней кавычки в строке. И вот это проблема. Я на вскидку не помню, какие суффиксы после числа могут быть у width, кроме %. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел) 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							RXL
							
						 | 
						
							
								  | 
								
									
									«  Ответ #4 : 14-08-2012 05:52 »    | 
								
								 | 
							  
							 
							Пробелы могут быть. Шаблон следующий: "\s*(\d+)\s*%?\s*". При этом, если это не XHTML, то и кавычки могут быть опцией. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							Dimka
							
								Деятель 
								Команда клуба
								
								 
								  Offline
								Пол:   
								
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #5 : 14-08-2012 06:25 »   | 
								
								 | 
							  
							 
							RXL, не согласен. Ты из группы исключил суффикс, а это существенная информация - единица измерения.
  Вообще атрибуты надо поштучно обрабатывать. Ведь их порядок тоже может быть произвольным. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел) 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							RXL
							
						 | 
						
							
								  | 
								
									
									 « Ответ #6 : 14-08-2012 09:01 »   | 
								
								 | 
							  
							 
							В HTML/XHTML нет суффиксов! Ты путаешь с CSS. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							Dimka
							
								Деятель 
								Команда клуба
								
								 
								  Offline
								Пол:   
								
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #7 : 14-08-2012 11:34 »   | 
								
								 | 
							  
							 
							RXL, как минимум там может быть число, или число с процентом. Вот это-то я точно не путаю. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел) 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							RXL
							
						 | 
						
							
								  | 
								
									
									 « Ответ #8 : 14-08-2012 13:31 »   | 
								
								 | 
							  
							 
							Совершенно верно. И шаблон в ответе 4 это учитывает. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							Dimka
							
								Деятель 
								Команда клуба
								
								 
								  Offline
								Пол:   
								
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #9 : 14-08-2012 15:01 »   | 
								
								 | 
							  
							 
							RXL, он это не учитывает постольку, поскольку тема про группы, про $1...$9. Ты же не поместил процент внутрь группы (скобок), т.е. при чтении группы ты не узнаешь, был ли там процент или не было, хотя в целом выражение будет распознано. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел) 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							RXL
							
						 | 
						
							
								  | 
								
									
									 « Ответ #10 : 14-08-2012 15:10 »   | 
								
								 | 
							  
							 
							В таком случае, предлагаю шаблон такого вида: "\s*(\d+)\s*(%)?\s*" Думаю, логичнее использовать две группы, чем проверять, есть ли в конце знак процента и нет ли пробелов. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							Dimka
							
								Деятель 
								Команда клуба
								
								 
								  Offline
								Пол:   
								
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #11 : 14-08-2012 15:26 »   | 
								
								 | 
							  
							 
							RXL, ну это уже зависит от задачи. Однако автор темы куда-то пропала. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел) 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							vika
							
						 | 
						
							
								  | 
								
									
									 « Ответ #12 : 15-08-2012 07:48 »   | 
								
								 | 
							  
							 
							В таком случае, предлагаю шаблон такого вида: "\s*(\d+)\s*(%)?\s*"
  Не работает шаблон Добавлено через 33 секунды:RXL, ну это уже зависит от задачи. Однако автор темы куда-то пропала.
  Так как все-таки вытаскивать из текста нужные куски???  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Последнее редактирование: 15-08-2012 07:48 от vika »
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							RXL
							
						 | 
						
							
								  | 
								
									
									 « Ответ #13 : 15-08-2012 09:32 »   | 
								
								 | 
							  
							 
							$test =~ m/\scellspacing\s*=\s*"\s*(\d+)\s*"[^>]*\swidth\s*=\s*"\s*(\d+)\s*(%)?\s*"/;
  print "$1\n\$2$3\n";  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							vika
							
						 | 
						
							
								  | 
								
									
									 « Ответ #14 : 15-08-2012 14:28 »   | 
								
								 | 
							  
							 
							Спасибо за пример. Но, хотелось бы услышать общие принципы. Что не читала, все или не работает, или очень заумно для понимания. Из того, что поняла =~m/(первое совпадение)\1 (второе совпадение)\2 ... (n-ное совпадение)\n/ Каждая скобка - подшаблон, \1 - локальная переменная, нумерация слева направо. Но, чет не робит ничего...    
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							RXL
							
						 | 
						
							
								  | 
								
									
									 « Ответ #15 : 15-08-2012 18:23 »   | 
								
								 | 
							  
							 
							vika, рекомендую почитать книгу "Программирование на Perl" Ларри Уолл и другие. (русский перевод, издательство Символ). У нас есть скан 3-го издания:  https://club.shelek.ru/viewfiles.php?id=19 У меня оно есть в бумажном виде - книга стоящая. Глава 5 "Поиск по шаблону", около 70 страниц. Там самое полное описание возможностей Perl по части регулярных выражений. Та часть, что интересует тебя, именуется "захват" - в книге этому посвящены три страницы. Что-то мы можем рассказать здесь, но все же за деталями обратись к книге. Конструкция "\1" называется ссылкой - это не переменная. Использование сего не просто и требует внимательности. Если не работает, то приводи выражение и контрольную строку, на которой проверяешь. Иначе и сказать больше нечего.  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							vika
							
						 | 
						
							
								  | 
								
									
									 « Ответ #16 : 17-08-2012 16:15 »   | 
								
								 | 
							  
							 
							Большое спасибо.    
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	 |