Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Saya Boleh Melakukan Padanan Negatif dengan Berkesan dalam Ungkapan Biasa Go Tanpa Melihat sekeliling?

Bagaimanakah Saya Boleh Melakukan Padanan Negatif dengan Berkesan dalam Ungkapan Biasa Go Tanpa Melihat sekeliling?

Mary-Kate Olsen
Lepaskan: 2024-12-20 12:39:09
asal
513 orang telah melayarinya

How Can I Effectively Perform Negative Matching in Go Regular Expressions Without Lookarounds?

Padanan Negatif dalam Go Regex

Dalam Go regexp, memadankan segala-galanya kecuali rentetan malar tertentu boleh mencabar kerana kekurangan binaan lihat sekeliling .

Asal RegExp:

Ungkapan biasa yang disediakan, /.*/.*/(.*), sepadan dengan segala-galanya selepas tiga garis miring ke belakang. Walau bagaimanapun, ia tidak mengecualikan rentetan yang mengandungi "somestring".

Pendekatan Penolakan

Kaedah 1: Perkhidmatan Web

Satu penyelesaian melibatkan penggunaan perkhidmatan web yang menjana corak dinafikan serasi POSIX. Untuk "somestring", ini menjana corak kompleks yang boleh digantikan ke dalam RegExp asal:

/[^/]*/[^/]*/^([^s]|s(s|o(s|m(s|es(omes)*(s|t(s|r(s|i(s|ns)))|o(s|ms)))))*([^os]|o([^ms]|m([^es]|e([^s]|s(omes)*([^ost]|t([^rs]|r([^is]|i([^ns]|n[^gs])))|o([^ms]|m([^es]|e[^s]))))))))*(s(s|o(s|m(s|es(omes)*(s|t(s|r(s|i(s|ns)))|o(s|ms)))))*(o((me?)?|mes(omes)*(t(r?|rin?)|o(me?)?)?))?)?$
Salin selepas log masuk

Kaedah 2: Kelas Aksara

Daripada menggunakan .* , ungkapan berikut menggunakan kelas aksara yang dinafikan [^/]:

`[^/]+/[^/]+/(.*)`
Salin selepas log masuk

Ini sepadan dengan apa-apa sahaja sehingga yang ketiga garis miring ke belakang, tetapi ia tidak mengecualikan rentetan dengan "somestring".

Penyelesaian menggunakan Kumpulan Tangkap

Memandangkan RE2 (yang digunakan oleh Go) tidak menyokong pandangan ke hadapan, kami boleh menangkap ketiga-tiga bahagian rentetan dan semak nilai yang diekstrak bagi kumpulan tangkapan:

import (
    "fmt"
    "regexp"
)

func main() {
    s := "anything/anything/somestring"
    r := regexp.MustCompile(`^[^/]+/[^/]+/(.*)`)
    val := r.FindStringSubmatch(s)
    if len(val) > 1 && val[1] != "somestring" {
        fmt.Println(val[1])
    } else {
        fmt.Println("No match")
    }
}
Salin selepas log masuk

Pendekatan ini menangkap memadankan nilai dan mencetaknya jika ia tidak sepadan dengan "somestring".

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Melakukan Padanan Negatif dengan Berkesan dalam Ungkapan Biasa Go Tanpa Melihat sekeliling?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan