Ruby "hello world" .scan (/ (\ w) {2} /) не то же самое, что "hello world" .scan (/ \ w {2} /)? - PullRequest
3 голосов
/ 06 ноября 2010

Я думал, что знаю scan в Ruby: как будто он выполняет одно совпадение, но повторить его для всех результатов и поместить в массив?

ruby-1.9.2-p0 > "hello world".scan(/\w{2}/)
 => ["he", "ll", "wo", "rl"] 

ruby-1.9.2-p0 > "hello world".scan(/(\w){2}/)
 => [["e"], ["l"], ["o"], ["l"]] 

Почему вторая строка привела к тому - и как вы заставляете ее возвращать тот же результат, что и строка 1? (потому что иногда мы должны добавить () к регулярному выражению.


в качестве контракта, с или без (), то же самое:

ruby-1.9.2-p0 > "hello world"[/\w{2}/]
 => "he" 

ruby-1.9.2-p0 > "hello world"[/(\w){2}/]
 => "he" 

Ответы [ 2 ]

3 голосов
/ 06 ноября 2010

Парены создают группу совпадений.Попробуйте /(?:\w){2}/ вместо.

0 голосов
/ 06 ноября 2010

Я нашел кое-что еще:

scan, кажется, работает с использованием группы, если таковая имеется, поэтому поведение второй строки было таким. (используя последний соответствующий контент внутри ( ) и используйте его в результатах внутри массива.)

В качестве теста: (если групп несколько, все группы объединяются в один массив)

ruby-1.9.2-p0 > "hello world".scan(/((\w){2})/)
 => [["he", "e"], ["ll", "l"], ["wo", "o"], ["rl", "l"]] 

Это способ получить его: всегда добавляйте верхний уровень ( ) и используйте map, чтобы получить первый элемент в массиве (т. Е. Соответствие верхнего уровня):

ruby-1.9.2-p0 > "hello world".scan(/((\w){2})/).map {|e| e.first}
 => ["he", "ll", "wo", "rl"]

Но я все же хотел бы найти более простой ответ ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...