0Pricing
Swift Academy · Урок

Захватывающие группы

Извлекайте подстроки из результатов сопоставления.

«Захватывающие группы» — бесплатный урок Swift Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.

Группы захвата

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

Один захват

Заключение части шаблона в () захватывает её. Результат совпадения становится кортежем: сначала идёт всё совпадение, затем каждый захват.

if let m = "v2".firstMatch(of: /v(\d+)/) {
    print("Whole: \(m.0)")
    print("Group: \(m.1)")
}

Несколько захватов

Каждая пара круглых скобок добавляет в выходной кортеж ещё один элемент в порядке слева направо.

if let m = "2024-05-30".wholeMatch(of: /(\d{4})-(\d{2})-(\d{2})/) {
    print("Year: \(m.1)")
    print("Month: \(m.2)")
    print("Day: \(m.3)")
}

Всё совпадение находится в .0

Элемент .0 результата всегда содержит весь совпавший текст. Захваты начинаются с .1.

if let m = "key=value".wholeMatch(of: /(\w+)=(\w+)/) {
    print("Full: \(m.0)")
    print("Key: \(m.1), Value: \(m.2)")
}

Захваты — это подстроки

По умолчанию захваты имеют тип Substring и указывают на часть исходной строки. Преобразуйте их с помощью String(...), если нужно сохранить их.

if let m = "abc123".firstMatch(of: /([a-z]+)(\d+)/) {
    let letters = String(m.1)
    let numbers = String(m.2)
    print(letters, numbers)
}

Необязательные захваты

Если группа необязательна и за ней следует ?, её захват может иметь значение nil, если группа не участвовала в совпадении.

if let m = "color".wholeMatch(of: /colou?(r)/) {
    print("Captured: \(m.1)")
}

Именованные захваты

Группе можно присвоить имя с помощью (?<name>...) и прочитать её через именованный результат, что понятнее числовых индексов.

let re = /(?<area>\d{3})-(?<line>\d{4})/
if let m = "555-1234".wholeMatch(of: re) {
    print("Area: \(m.area)")
    print("Line: \(m.line)")
}

Перебор захватов

Объедините захваты с matches(of:), чтобы одновременно извлекать структурированные данные из множества совпадений.

let log = "a=1 b=2 c=3"
for m in log.matches(of: /(\w+)=(\d+)/) {
    print("\(m.1) -> \(m.2)")
}

Вложенные группы

Группы могут быть вложенными. Внешняя группа захватывает целое, а внутренние группы — его части. Нумерация соответствует порядку открывающих скобок.

if let m = "12:30".wholeMatch(of: /((\d+):(\d+))/) {
    print("All: \(m.1)")
    print("H: \(m.2), M: \(m.3)")
}

Группы без захвата

Используйте (?:...), чтобы сгруппировать элементы без захвата, если группировка нужна только для квантификатора и дополнительный элемент кортежа не требуется.

if let m = "abab".wholeMatch(of: /(?:ab)+/) {
    print("Matched: \(m.0)")
}

Создание разборщика

Захваты превращают необработанный текст в типизированные значения. Здесь мы разбираем строку с координатами на целые числа.

func parsePoint(_ s: String) -> (Int, Int)? {
    guard let m = s.wholeMatch(of: /(\d+),(\d+)/),
          let x = Int(m.1), let y = Int(m.2) else { return nil }
    return (x, y)
}
print(parsePoint("3,7") ?? "nil")

Быстрая проверка

Для шаблона /(\d{4})-(\d{2})/, совпадающего со строкой "2024-05", чему равно m.2?

Итоги

Круглые скобки создают группы захвата, доступные как кортеж: .0 содержит всё совпадение, а .1, .2 и последующие — захваты. Вы изучили именованные, необязательные, вложенные группы и группы без захвата. Далее вы создадите регулярные выражения из понятного кода Swift с помощью RegexBuilder.

Часто задаваемые вопросы

Урок «Захватывающие группы» бесплатный?

Да — полный текст урока «Захватывающие группы» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.

Чему я научусь в уроке «Захватывающие группы»?

Извлекайте подстроки из результатов сопоставления. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Swift Academy?

Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Захватывающие группы»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Swift Academy?

Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Литералы Regex и сопоставление
  2. Захватывающие группы
  3. RegexBuilder DSL
  4. Замена и разделение текста
← Назад к Swift Academy