[Ruby] //g

Ihar Viarheichyk i.viarheichyk at sam-solutions.net
Thu Oct 10 20:20:27 MSD 2002


On Wed, Oct 09, 2002 at 11:58:05AM +0300, Alexander Bokovoy wrote:
> On Wed, Oct 09, 2002 at 12:57:54PM +0700, Ilya Palagin wrote:
> > Неужто в рубиновом regexp не сделали опцию g (глобальный поиск)?
> > В перловом regexp это часто используется для поиска n-го совпадения
> > или подсчета количества совпадений.
> > 
> > Например, мне нужно найти подстроку, находящуюся перед третьим
> > вхождением "var",
> > в perl я бы это сделал так:
> > $string = "var one 23 var two 4 who and var 17 ozzy where var 9";
> > $count = 0;
> > while($string =~ /var/g) {
> > 	print $` . "\n" if ($count++ == 2);
> > }
> > 
> > Можно ли сделать то же самое средствами regexp в ruby, не раскладывая
> > строку на составляющие для подсчета кол-ва вохждений?
> В данном случае надо использовать стандартный шаблон-итератор в строке и
> особенность метода глобальной замены String#gsub, позволяющего указывать
> строку-заменитель в виде итератора:
> 
> string = "var one 23 var two 4 who and var 17 ozzy where var 9"
> 
> count = 0
> 
> string.gsub /var/ do |str|
> 	puts $` if (count+=1) == 3
> end
> 
> Обратите внимание на то, что мы выполняем присваивание _до_ сравнения,
> потому и 3 вместо 2.
> 
> И еще, результат операции глобальной замены мы, естественно, игнорируем.

Да тут много способов существует. Можно так:
 string = "var one 23 var two 4 who and var 17 ozzy where var 9"
 result = ('+'=~'-'; 1.upto(3) { string =~ "^(#{$&}.*?)var"}; $1)

---- 
Igor Vergeichik
ICQ 47298730




More information about the Ruby mailing list