Если квантификатор *
представляет собой «ноль или более раз», похоже, "aabbcc"[/ab*/]
должен вернуть "abb"
, но он возвращает только "a"
.Почему «aabbcc» [/ ab * /] возвращает «a»?
ответ
Хорошо, поэтому я только что узнал, потому что самый лучший матч выигрывает, и так как есть a
, который соответствует до abb
, это то, что было возвращено.
Очень хороший ресурс для проверки регулярного выражения ruby - http://rubular.com/. Как вы уже заметили, регулярное выражение возвращает первое совпадение, а ab * соответствует 'a', а также' abb'. Также обратите внимание, что регулярное выражение также жадно по умолчанию, так что/a * c/будет соответствовать 'aabbcc' (раздражает при сопоставлении фигурных скобок, поскольку иногда вы заканчиваете тем, что сопоставляете последнюю скобку в своей строке, а не ту, которая фактически закрывает скобку. – Tigraine
@Tigraine : Для этого вам понадобится '/\(.*?\)/' или '/ \ ([^ \)] * \) /' –
@Tigraine: '" aabbcc "[/ a * c /]' возвращает 'c' – maml
Регулярное выражение возвращает именно то, что вы просили: первое появление 1 a
, за которым следует 0 или более b
.
Если вы хотите, чтобы все неперекрывающихся вхождений, можно использовать scan
:
"aabbcc".scan(/ab*/)
#=> ["a", "abb"]
Если вы хотите иметь не менее 1 b
, вы могли бы использовать b+
:
"aabbcc"[/ab+/]
#=> "abb"
Почему? '' a'' содержит 'b' ноль или более раз, не так ли? –