Go в примери: Редовѝ изрази

Го предлага вградена поддръжка за редовѝ изрази1. Ето няколко примера с често срещани задачи, налагащи използването на поредови изрази.


  1. regular expressions – редовѝ изрази – изрази, съставени от поредици от знаци за търсене на подобия в словен плет и вероятно заместване, регулярни изрази. https://bg.wikipedia.org/wiki/Регулярен_израз
package main
import (
    "bytes"
    "fmt"
    "regexp"
)
func main() {

Този израз проверява за съответствие1 в низ.


  1. match – (намирам) съответствие, съвпадение, подобие
    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 хвърля в ужас програмата вместо да хвърли грешка, което я прави по-сигурна за употреба с общи променливи. Програмата ще „гръмне” в началото на изпълнението, а не по средата, а вие да се чудите какво не е наред.


  1. global – общи, общодостъпни, достъпни, видими отвсякъде, глобални променливи
    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.

Следващ пример: .