LeadKit/docs/titextprocessing/titextprocessing.md

5.6 KiB
Raw Blame History

TITextProcessing

Библиотека для работы с регулярными выражениями

- TextFormatter

Класс TextFormatter представляет из себя сервис, принимающий регулярное выражение на вход и предоставляющий возможность генерации следующих объектов:

- Replacement template из getRegexReplacement();
- Placeholder из getRegexPlaceholder();
- Formatter text из getFormattedText(_ text: String)

func getRegexReplacement()

Метод, преобразующий входящее регулярное выражение в шаблон подстановки, например:

Input: (\\d{4}) ?(\\d{4}) ?(\\d{4}) ?(\\d{4})
Output: $1 $2 $3 $4

import Foundation
import TITextProcessing

let cardNumberTextFormatter = TextFormatter(regex: "(\\d{4}) ?(\\d{4}) ?(\\d{4}) ?(\\d{4})")

print(cardNumberTextFormatter.getRegexReplacement())

/*
 Выведет в консоль:
 "$1 $2 $3 $4"
 */

func getRegexPlaceholder()

Метод, преобразующий входящее регулярное выражение в текст-заполнитесь a.k.a placeholder, например:

Input: (\\d{4}) ?(\\d{4}) ?(\\d{4}) ?(\\d{4})
Output: 1234 5678 9012 3456

print(cardNumberTextFormatter.getRegexPlaceholder())

/*
 Выведет в консоль:
 "1234 5678 9012 3456"
 */

func getFormattedText(_ text: String) -> String

Метод, преобразующий входящий текст к нужному формату, заранее определенному посредством указания регулярного выражения, например:

Input: 2200111555550080
Output: 2200 1115 5555 0080

P.S. Учитываем, что TextFormatter был проинициализирован со слеюущим регулярным выражением: (\\d{4}) ?(\\d{4}) ?(\\d{4}) ?(\\d{4})

print(cardNumberTextFormatter.getFormattedText("2200111555550080"))

/*
 Выведет в консоль:
 "2200 1115 5555 0080"
 */

- RegexReplaceGenerator

Класс, отвечающий за генерацию PCREGeneratorItem из входящего регулярного выражения. Использует библиотеку Antlr4 и PCRE для работы.

func generateReplacement(for regex: String) -> PCREGeneratorItem

Функция, преобразующий входящее регулярное выражение в структуру, содержащую шаблон подстановки и матрицу символов, например:

let replaceGenerator: RegexReplaceGenerator = DefaultRegexReplaceGenerator()
let item = replaceGenerator.generateReplacement(for: "(\\d{2})\\/?(\\d{2})")

print(item.regexReplaceString)

/*
Выведет в консоль:
"$1\\/$2"
*/

print(item.matrixOfSymbols)

/*
Выведет в консоль:
[
    ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"],
    ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"],
    ["/"],
    ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"],
    ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"]
]
*/

Итоговый PCREGeneratorItem содержит следующие данные:

regexReplaceString - итоговый шаблон подстановки для изначального регулярного выражения;
matrixOfSymbols - матрица символов, содержащая все возможные символы для каждого элемента в изначальном регулярном выражении

- RegexPlaceholderGenerator

Класс, отвечающий за генерацию текста-заполнителя a.k.a placeholder.

func generatePlaceholder(matrixOfSymbols: [[Character]]) -> String

Функция, преобразующая входящую матрицу символов в текст-заполнитель, например:

let matrix: [[Character]] = [
    ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"],
    ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"],
    ["/"],
    ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"],
    ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"]
]

let placeholderGenerator: RegexPlaceholderGenerator = DefaultRegexPlaceholderGenerator()
let placeholder = placeholderGenerator.generatePlaceholder(matrixOfSymbols: matrix)

print(placeholder)

/*
Выведет в консоль:
"12/34"
*/

- Примеры использования:

// MARK: - Форматирование даты

let dateRegex = "(\\d{2})\\/?(\\d{2})"
let dateInputText = "1525"

let dateTextFormatter = TextFormatter(regex: dateRegex)

print(dateTextFormatter.getRegexPlaceholder())

/*
Выведет в консоль:
"12/34"
*/

print(dateTextFormatter.getFormattedText(dateInputText))

/*
Выведет в консоль:
"15/25"
*/

// MARK: - Форматирование номера телефона

let phoneRegex = "(?:\\+7 )?\\(?(\\d{3})\\)? ?(\\d{3}) ?(\\d{2}) ?(\\d{2})"
let phoneInputText = "9995534820"

let phoneTextFormatter = TextFormatter(regex: phoneRegex)

print(phoneTextFormatter.getRegexPlaceholder())

/*
Выведет в консоль:
"+7 (123) 456 78 90"
*/

print(phoneTextFormatter.getFormattedText(phoneInputText))

/*
Выведет в консоль:
"+7 (999) 553 48 20"
*/