87 lines
4.1 KiB
Go
87 lines
4.1 KiB
Go
// Go предлагает встроенную поддержку [регулярных выражений](http://en.wikipedia.org/wiki/Regular_expression).
|
||
// Вот несколько примеров, связанных с регулярными
|
||
// выражениями в Go.
|
||
|
||
package main
|
||
|
||
import (
|
||
"bytes"
|
||
"fmt"
|
||
"regexp"
|
||
)
|
||
|
||
func main() {
|
||
|
||
// Проверяем, соответствует ли шаблон строке
|
||
match, _ := regexp.MatchString("p([a-z]+)ch", "peach")
|
||
fmt.Println(match)
|
||
|
||
// Выше мы использовали строковый шаблон напрямую,
|
||
// но для других задач с регулярными выражениями,
|
||
// необходимо `скомпилировать` оптимизированную
|
||
// структуру `Regexp`.
|
||
r, _ := regexp.Compile("p([a-z]+)ch")
|
||
|
||
// Множество методов доступны для этой структуры.
|
||
// Вот тест на совпадение, который мы видели ранее.
|
||
fmt.Println(r.MatchString("peach"))
|
||
|
||
// Этот метод находит соответствие для регулярного
|
||
// выражения.
|
||
fmt.Println(r.FindString("peach punch"))
|
||
|
||
// Этот метод также находит первое совпадение, но
|
||
// возвращает начальный и конечный индексы совпадения
|
||
// вместо текста.
|
||
fmt.Println(r.FindStringIndex("peach punch"))
|
||
|
||
// Варианты `Submatch` включают в себя информацию
|
||
// как о совпадениях с полным шаблоном, так и о
|
||
// совпадениях с частями шаблона. Например, эта
|
||
// конструкция вернет информацию как
|
||
// для `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")))
|
||
|
||
// При создании констант с регулярными выражениями
|
||
// вы можете использовать `MustCompile`, как аналог
|
||
// `Compile`. Обычный `Compile` не будет работать
|
||
// для констант, потому что он возвращает 2 значения.
|
||
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))
|
||
}
|