Книга: Программирование на языке 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
поглощает все вхождения буквы с
и (в соответствии с собственническим инстинктом) не отдает их назад, препятствуя возврату.
- 3.1. Синтаксис регулярных выражений
- 3.2. Компиляция регулярных выражений
- 3.3. Экранирование специальных символов
- 3.4. Якоря
- 3.5. Кванторы
- 3.6. Позитивное и негативное заглядывание вперед
- 3.7. Обратные ссылки
- 3.8. Классы символов
- 3.9. Обобщенные регулярные выражения
- 3.10. Сопоставление точки символу конца строки
- 3.11. Внутренние модификаторы
- 3.12. Внутренние подвыражения
- 3.13. Ruby и Oniguruma
- 3.14. Примеры регулярных выражений
- 3.15. Заключение
- 3.11. Внутренние модификаторы
- Внутренние ссылки
- 8.4.5. Внутренние цифровые интерфейсы
- Внешние и внутренние факторы
- 2.1. Внутренние устройства
- Внутренние функции SQL
- 6.7.2.1. Внутренние накопители информации на жестких магнитных дисках
- Приложение. Внутренние установки человека
- Внутренние триггеры
- Внешние и внутренние коммуникации
- 8.3.2 Внутренние системные тайм-ауты
- Внешние и внутренние средства влияния