2017-02-08 2 views
1

Если квантификатор * представляет собой «ноль или более раз», похоже, "aabbcc"[/ab*/] должен вернуть "abb", но он возвращает только "a".Почему «aabbcc» [/ ab * /] возвращает «a»?

+0

Почему? '' a'' содержит 'b' ноль или более раз, не так ли? –

ответ

1

Хорошо, поэтому я только что узнал, потому что самый лучший матч выигрывает, и так как есть a, который соответствует до abb, это то, что было возвращено.

+1

Очень хороший ресурс для проверки регулярного выражения ruby ​​- http://rubular.com/. Как вы уже заметили, регулярное выражение возвращает первое совпадение, а ab * соответствует 'a', а также' abb'. Также обратите внимание, что регулярное выражение также жадно по умолчанию, так что/a * c/будет соответствовать 'aabbcc' (раздражает при сопоставлении фигурных скобок, поскольку иногда вы заканчиваете тем, что сопоставляете последнюю скобку в своей строке, а не ту, которая фактически закрывает скобку. – Tigraine

+0

@Tigraine : Для этого вам понадобится '/\(.*?\)/' или '/ \ ([^ \)] * \) /' –

+1

@Tigraine: '" aabbcc "[/ a * c /]' возвращает 'c' – maml

4

Регулярное выражение возвращает именно то, что вы просили: первое появление 1 a, за которым следует 0 или более b.

Если вы хотите, чтобы все неперекрывающихся вхождений, можно использовать scan:

"aabbcc".scan(/ab*/) 
#=> ["a", "abb"] 

Если вы хотите иметь не менее 1 b, вы могли бы использовать b+:

"aabbcc"[/ab+/] 
#=> "abb" 
Смежные вопросы