Книга: Программирование на языке Ruby

3.12. Внутренние подвыражения

3.12. Внутренние подвыражения

Для указания подвыражений применяется нотация ?>:

re = /(?>abc)(?>def)/   # То же, что /abcdef/
re.match("abcdef").to_a # ["abcdef"]

Отметим, что наличие подвыражения еще не означает группировки. С помощью дополнительных скобок их, конечно, можно превратить в запоминаемые группы.

Еще обратим внимание на то, что эта конструкция собственническая, то есть жадная и при этом не допускает возврата в подвыражение.

str = "abccccdef"
re1 = /(abc*)cdef/
re2 = /(?>abc*)cdef/
re1 =~ str          # 0
re2 =~ str          # nil
re1.match(str).to_a # ["abccccdef", "abccc"]
re2.match(str).to_a # []

В предыдущем примере подвыражение abc* выражения re2 поглощает все вхождения буквы с и (в соответствии с собственническим инстинктом) не отдает их назад, препятствуя возврату.

Оглавление книги


Генерация: 4.610. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз