180 lines
5.6 KiB
Markdown
180 lines
5.6 KiB
Markdown
|
||
# `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"
|
||
*/
|
||
```
|