Го предлага вградена поддръжка за редовѝ изрази1. Ето няколко примера с често срещани задачи, налагащи използването на поредови изрази.
import (
"bytes"
"fmt"
"regexp"
)
func main() {
Този израз проверява за съответствие1 в низ.
match, _ := regexp.MatchString("п([а-я]+)а", "праскова")
fmt.Println(match)
Горе приложихме израза за търсене направо върху
низа, но в други случаи ще ви е нужно да
компилирате с Compile оптимизирана структура от
вида Regexp.
r, _ := regexp.Compile("п([а-я]+)а")
Тази структура има много методи. Ето я същата
проверка за съвпадение като горе, но вече не като
функция, а като метод на Regexp.
fmt.Println(r.MatchString("праскова"))
Това извикване намира съответствие в подадения низ и връща съответстващото.
fmt.Println(`съвп.:`,
r.FindString("прасковa с дупка"))
Това също намира първото съвпадение, но връща местата на началото и края на съвпаденията в словния плет.
fmt.Println("показалци:",
r.FindStringIndex("прасковa с дупка"))
Разновидностите на метода Submatch включват
сведения, както за цялото съвпадение, така и за
подсъответствията – частите му. Така например
следното извикване връща сведения за п([а-я]+)а
и ([а-я]+).
fmt.Println(r.FindStringSubmatch("прасковa с дупка"))
Подобно, следното извикване ще върне сведения за местонахожденията на съвпаденията и частите.
fmt.Println(
r.FindStringSubmatchIndex("прасковa с дупка"))
Разновидностите, съдържащи в името си All,
се прилагат върху целия низ и връщат всички
съвпадения, не само първото. Например, ето как
намираме всички подобия за един редовѝ израз.
fmt.Println(
r.FindAllString("прасковa с дупка и щипалка", -1))
Тези разновидности с All (всички), ги има и за
другите методи, които видяхме по-горе.
fmt.Println("всички:",
r.FindAllStringSubmatchIndex(
"прасковa с дупка и щипалка", -1))
Ако подадем на тези методи положително цяло число след низа, ограничаваме броя на търсените подобия.
fmt.Println(
r.FindAllString("прасковa с дупка и щипалка", 2))
Примерите по-горе ползваха низове като податки и
използваха методи с имена като MatchString
(намеривниз). Но можем да подадем и данни от вида
[]byte и да махнем String от името на
извиквания метод.
fmt.Println(r.Match([]byte("праскова")))
Когато създавате общи1 променливи,
съдържащи редовѝ изрази, можете да използвате
разновидността MustCompile вместо Compile.
MustCompile хвърля в ужас програмата вместо да
хвърли грешка, което я прави по-сигурна за употреба
с общи променливи. Програмата ще „гръмне” в началото
на изпълнението, а не по средата, а вие да се
чудите какво не е наред.
r = regexp.MustCompile("п([а-я]+)а")
fmt.Println("израз:", r)
Пакетът regexp може да се използва за заместване
на подмножества от даден низ с други стойности.
fmt.Println(r.ReplaceAllString("една праскова", "слива"))
Разновидността, съдържаща Func в името на метода
ви позволява да промените намерения откъс с
произведението на подадена от вас функция.
in := []byte("една праскова")
out := r.ReplaceAllFunc(in, bytes.ToUpper)
fmt.Println(string(out))
}
$ go run regular-expressions.go
true
true
съвп.: пра
показалци: [0 6]
[пра р]
[0 6 2 4]
[пра пка палка]
всички: [[0 6 2 4] [23 29 25 27] [37 47 39 45]]
[пра пка]
true
израз: п([а-я]+)а
една слива
една ПРАСКОВА
За да видите пълния справочник на редовѝте изрази,
погледнете документацията за пакета
regexp.
Следващ пример: JSON.