Всем привет! Сегодня я собираюсь показать вам, как работать с Swift Regex, который был добавлен в Swift 5.7

Как мы работали с регулярными выражениями до Swift Regex?

До того как мы получили в свой арсенал Swift Regex, мы были вынуждены использовать следующее:

  1. NSRegularExpression

  2. Методы, которые предоставляет NSString
    range(of:options:range:locale:)
    replacingOccurrences(of:with:options:range:)
    ・и т.д. …

Пример проверки формата {год}-{месяц{-{день}} с помощью NSRegularExpression.
Пример проверки формата {год}-{месяц{-{день}} с помощью NSRegularExpression.

Есть несколько причин, по которым я считаю, что NSRegularExpression — не самый удобный в использовании инструмент.

  1. Мы должны сразу использовать “try” уже только для создания инстанса класса NSRegularExpression, что непременно заставляет нас ожидать ситуации, когда возникают какие-либо ошибки.

  2. Чтобы написать регулярное выражение, нам нужно использовать двойные escape-символы.

  3. Чтобы получить финального решения, мы должны использовать NSRange и Range.

  4. Чтобы получить результат, нам необходима опциональная привязка (которую я пропустил в примере выше).

Но, к счастью, нам не нужно беспокоиться обо всем этом, если мы используем Swift Regex.

В чем заключаются преимущества Swift Regex по сравнению со старыми способами?

“Meet Swift Regex” 6:28.
“Meet Swift Regex” 6:28.

1. Литералы лаконичны; билдеры вносят структуру.

Swift Regex выглядит более интуитивно понятным благодаря своим билдерам регулярных выражений (в особенности resultBuilder, который будет описан чуть позже).

Сравнение NSRegularExpression и Swift Regex:

2. Реальные парсеры как части регулярных выражений

Мы можем использовать уже существующие готовые парсеры (т.е.Date.ParseStrategy).

“Meet Swift Regex” 8:57.
“Meet Swift Regex” 8:57.

А также, мы можем использовать кастомные парсеры, если мы подготовим тип, соответствующий CustomConsumingRegexComponent.

Как соответствовать CustomConsumingRegexComponent.
Как соответствовать CustomConsumingRegexComponent.

3. Regex умеет в Unicode

Были реализованы следующие две фичи:

i: Каноническая эквивалентность
ii: Расширенные кластеры графем и классы символов со строками

4. Предсказуемое выполнение, очевидные элементы управления

Если мы будем использовать Swift Regex, мы сможем воспользоваться подсказками среды разработки и уменьшить количество ошибок во время компиляции!

К нам на помощь приходят подсказки среды разработки.
К нам на помощь приходят подсказки среды разработки.

Как работать со Swift Regex?

В нашем распоряжении есть три способа его использования.

1. Regex-литералы

Мы можем писать очень лаконично. На самом деле, нам больше не нужно использовать двойные escape-символы и беспокоиться о do-catch, как при работе с NSRegularExpression.

Как использовать Regex-литералы.
Как использовать Regex-литералы.

2. Run-time конструкции

Эта фича может очень пригодится для полей поиска в редакторах или консольных утилит.

Если ввод Regex.init(_:) окажется невалидным, то мы получим ошибку времени выполнения. Типом вывода будет AnyRegexOutput. А значение мы можем извлечь следующим образом:

Как использовать Run-time конструкции.
Как использовать Run-time конструкции.

Мы можем извлечь результат с помощью extractValues(as:), но я не смог получить значение, когда пробовал использовать в качестве входных данных String.self.

Если вам интересно, содержимое match.output было следующим:

AnyRegexOutput(input: “2023–03–20”, _elements: [_StringProcessing.AnyRegexOutput.ElementRepresentation(optionalDepth: 0, content: Optional((range: Range(Swift.String.Index(_rawBits: 15)..<Swift.String.Index(_rawBits: 655367)), value: nil)), name: nil, referenceID: nil)])

3. Regex-билдеры

Лично я считаю, что это самая хорошо структурированная форма написания регулярных выражений, доступная в Swift.

Это также наиболее интуитивно понятная форма с точки зрения чтения. И, конечно же, нам больше не нужна куча всяких мелочей, необходимых для NSRegularExpression

Как использовать Regex-билдеры
Как использовать Regex-билдеры

А причина, по которой мы можем писать Regex таким интуитивно понятным способом, — это resultBuilder. Ниже приведена его реализация:

Как реализован Regex-билдер.
Как реализован Regex-билдер.

Некоторые типы, которые мы можем использовать для создания Regex

На сегодня мне осталось только показать вам некоторые типы, которые соответствуют RegexComponent. Мы можем использовать эти типы для создания инстансов Regex.

One

Это тип нужен, чтобы подтвердить, что во входных данных есть только одно вхождение указанного символа (то есть date(:locale:timeZone:calendar:) в примере ниже).

Если их 0 или более 2, содержание “match” будет nil.

Как использовать One.
Как использовать One.

ZeroOrMore

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

Как использовать ZeroOrMore.

OneOrMore

Это тип нужен, чтобы подтвердить, что существует более одного указанного символа. Таким образом, если нет указанных символов, содержимое “match” будет nil.

Как использовать OneOrMore.
Как использовать OneOrMore.

Repeat

Это тип, подтверждающий наличие указанного количества указанных символов.

Как использовать Repeat.
Как использовать Repeat.

Capture

Если мы воспользуемся Capture, мы сможем извлечь каждое значение из указанного ключа.

Как использовать Capture вместе с Regex-билдерами.
Как использовать Capture вместе с Regex-билдерами.

Нам не нужно указывать тип каждого ключа, если мы используем Regex-литералы.

Как использовать Capture вместе с Regex-литералами.
Как использовать Capture вместе с Regex-литералами.

TryCapture

Если мы используем TryCapture, мы можем преобразовать захваченное значение и конвертировать его!

Как использовать TryCapture.
Как использовать TryCapture.

Возможности Xcode

Вы можете автоматически конвертировать Regex-билдеры в Regex-литералы, как показано ниже. Таким образом, даже если вы не знакомы с Regex-билдерами, то вам не о чем беспокоиться!

Функция Xcode для преобразования Regex-билдеров.
Функция Xcode для преобразования Regex-билдеров.

Ссылки


Сегодня состоится открытое занятие "Поддержка многоязычности в приложениях iOS".

На уроке начнем с того, как обстоят дела со стандартной локализацией строк в типовом проекте под iOS, какие проблемы могут встретится при разработке и тестирования приложения. Узнаем, как эти проблемы решаются инструментами кодогенерации SwiftGen, R.swift, поговорим о различиях и о том, как их настроить для строк. Узнаем, что такое плюрализм и как его использовать для того, чтобы перевод строк был менее топорным.

Обсудим инструмент Localinter как решение, позволяющее автоматизировать ревью строковых констант. Рассмотрим различные способы и платформы для профессиональных переводов строк. Под конец спикер даст еще полезной информации, куда копать в реализации многонациональных приложений с учетом региональных различий.

Записаться можно на странице курса iOS Developer. Professional.

Комментарии (0)