[Ruby] //g

Alexander Bokovoy a.bokovoy at sam-solutions.net
Wed Oct 9 12:58:05 MSD 2002


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.

И еще, результат операции глобальной замены мы, естественно, игнорируем.

-- 
/ Alexander Bokovoy
---
Fools rush in -- and get the best seats in the house.



More information about the Ruby mailing list