Захватывающие группы
Извлекайте подстроки из результатов сопоставления.
«Захватывающие группы» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Литералы Regex и сопоставление
- Захватывающие группы
- RegexBuilder DSL
- Замена и разделение текста