Регулярні Вирази|Regular Expressions
#
// Як і інші мови програмування - Go має підтримку
// [регулярних виразів](https://uk.wikipedia.org/wiki/Регулярний_вираз)
// у стандартній бібліотеці. Ось, деякі приклади задач, що так чи
// інакше пов'язані з регулярними виразами (або `regexp` - як їх зазвичай називають).
package main
import (
"bytes"
"fmt"
"regexp"
)
func main() {
// Тестуємо - чи наш шаблон співпадає з рядком.
match, _ := regexp.MatchString("p([a-z]+)ch", "peach")
fmt.Println(match)
// Рядком вище - ми скористались рядковим шаблоном напряму,
// але для інших задач, пов'язаних з регулярними виразами,
// нам необхідно буде `Compile` (скомпілювати) рядковий
// шаблон у `Regexp` структуру.
r, _ := regexp.Compile("p([a-z]+)ch")
// На таких структура доступно чимало різних методів:
// ось наприклад співставлення з рядком, що ми бачили в
// першому прикладі.
fmt.Println(r.MatchString("peach"))
// А тут, ми знаходимо збіги для нашого regexp'а.
fmt.Println(r.FindString("peach punch"))
// Цей приклад теж знайде збіги, але поверне початковий
// та кінцевий індекси, замість рядка що збігається.
fmt.Println(r.FindStringIndex("peach punch"))
// Варіації методів `Submatch` включать інформацію про
// повні збіги та часткові збіги в межах повних. Наприклад -
// це поверне інформацію про regexp'и `p([a-z]+)ch`
// та `([a-z]+)`.
fmt.Println(r.FindStringSubmatch("peach punch"))
// Схожим чином - ми можемо отримати індекс повного і
// часткового збігу.
fmt.Println(r.FindStringSubmatchIndex("peach punch"))
// Варіації методів `All` можуть застосовуватись до усіх збігів,
// а не лише - до першого. Приклад знаходження усіх збігів.
fmt.Println(r.FindAllString("peach punch pinch", -1))
// Варіації `All` також доступний і іншим методам (наприклад
// тим, що ми вже бачили).
fmt.Println(r.FindAllStringSubmatchIndex(
"peach punch pinch", -1))
// Другий аргумент (заданий додатнім цілим числом), допомагає
// обмежити кількість збігів.
fmt.Println(r.FindAllString("peach punch pinch", 2))
// Приклади що ми розглянули, отримують аргумент типу рядок і
// використовують імя на кшталт `MatchString`, але ми також можемо
// передати зріз байтів - `[]byte` (та прибрати `String`
// з імені методу) і отримаємо аналогічний метод, що буде
// працювати із зрізами байтів.
fmt.Println(r.Match([]byte("peach")))
// Створюючи константи regexp'ів - ви можете
// використати метод `MustCompile`, замість `Compile`.
// Простий `Compile` не працює з константами - оскільки повертає
// два значення, a `MustCompile` [панікує](./panic) у разі проблеми
// що робить його безпечним для використання під час компіляції.
r = regexp.MustCompile("p([a-z]+)ch")
fmt.Println(r)
// Пакет `regexp` можна використовувати для заміни часткових
// збігів рядків іншими значеннями.
fmt.Println(r.ReplaceAllString("a peach", "<fruit>"))
// Варіація методів `Func` дозволяє трансформувати текст за допомогою функції аргументу.
in := []byte("a peach")
out := r.ReplaceAllFunc(in, bytes.ToUpper)
fmt.Println(string(out))
}
$ go run regular-expressions.go
true
true
peach
idx: [0 5]
[peach ea]
[0 5 1 3]
[peach punch pinch]
all: [[0 5 1 3] [6 11 7 9] [12 17 13 15]]
[peach punch]
true
regexp: p([a-z]+)ch
a <fruit>
a PEACH
# Радимо, зачінити документацію пакету
# [`regexp`](http://golang.org/pkg/regexp/).