LeadKit/docs/titextprocessing/titextprocessing.md

180 lines
5.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# `TITextProcessing`
### Библиотека для работы с регулярными выражениями
## - `TextFormatter`
Класс `TextFormatter` представляет из себя сервис, принимающий регулярное выражение на вход и предоставляющий возможность генерации следующих объектов:
\- `Replacement template` из `getRegexReplacement()`;<br>
\- `Placeholder` из `getRegexPlaceholder()`;<br>
\- `Formatter text` из `getFormattedText(_ text: String)`
#### `func getRegexReplacement()`
Метод, преобразующий входящее регулярное выражение в шаблон подстановки, например:
**Input**: `(\\d{4}) ?(\\d{4}) ?(\\d{4}) ?(\\d{4})`<br>
**Output**: `$1 $2 $3 $4`
```swift
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})`<br>
**Output**: `1234 5678 9012 3456`
```swift
print(cardNumberTextFormatter.getRegexPlaceholder())
/*
Выведет в консоль:
"1234 5678 9012 3456"
*/
```
#### `func getFormattedText(_ text: String) -> String`
Метод, преобразующий входящий текст к нужному формату, заранее определенному посредством указания регулярного выражения, например:
**Input**: `2200111555550080`<br>
**Output**: `2200 1115 5555 0080`
> P.S. Учитываем, что `TextFormatter` был проинициализирован со слеюущим регулярным выражением: `(\\d{4}) ?(\\d{4}) ?(\\d{4}) ?(\\d{4})`
```swift
print(cardNumberTextFormatter.getFormattedText("2200111555550080"))
/*
Выведет в консоль:
"2200 1115 5555 0080"
*/
```
## - `RegexReplaceGenerator`
Класс, отвечающий за генерацию `PCREGeneratorItem` из входящего регулярного выражения. Использует библиотеку `Antlr4` и `PCRE` для работы.
#### `func generateReplacement(for regex: String) -> PCREGeneratorItem`
Функция, преобразующий входящее регулярное выражение в структуру, содержащую шаблон подстановки и матрицу символов, например:
```swift
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` - итоговый шаблон подстановки для изначального регулярного выражения;<br>
`matrixOfSymbols` - матрица символов, содержащая все возможные символы для каждого элемента в изначальном регулярном выражении
## - `RegexPlaceholderGenerator`
Класс, отвечающий за генерацию текста-заполнителя a.k.a placeholder.
#### `func generatePlaceholder(matrixOfSymbols: [[Character]]) -> String`
Функция, преобразующая входящую матрицу символов в текст-заполнитель, например:
```swift
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"
*/
```
## - Примеры использования:
```swift
// 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"
*/
```