Bolehkah saya Cari Semuanya Kecuali Rentetan Tertentu Menggunakan Go Regexp?
Seperti yang ditunjukkan oleh banyak soalan serupa, padanan dengan rentetan tertentu menggunakan Go ungkapan biasa boleh mencabar. Soalan ini menanyakan cara memadankan dengan rentetan dalam format "apa-apa sahaja/apa-apa rentetan," tetapi mengecualikan rentetan yang mengandungi "beberapa rentetan."
Corak "/././(. )" akan sepadan dengan "somestring," tetapi kami mahu memadankan segala-galanya kecuali ia. Kebanyakan penyelesaian yang dicadangkan menggunakan "/././((?!somestring).)," yang tidak sah dalam Go regexp kerana ia mengandungi token yang tidak boleh diukur.
Modul regexp Go tidak menyokong pandangan ke hadapan untuk memastikan had masa pelaksanaan linear (O(n)). Oleh itu, penyelesaian adalah perlu.
Perkhidmatan Web untuk Corak Nafi
Satu pendekatan ialah menggunakan perkhidmatan web bukan padanan-regex untuk menjana corak dinafikan yang serasi dengan POSIX. Untuk "somestring", corak yang dijana ialah:
^(1|s(s|o(s|m(s|es(omes))(s| t(s|r(s|i(s|ns)))|o(s|ms)))))(2|o( 3|m(4|e(1|s(omes)(5|t(6|r(7|i( 8|n9)))|o(3|m(4|e1))))))))(s|o(s|m(s|es(s) o mes)(s|t(s|r(s|i(s|ns)))|o(s|ms)))))(o((saya?)?|mes(omes )*(t(r?|rin?)|o(saya?)?)?))?)?$
Menggantikan "(.*)" terakhir dengan "
/10/10/((1 |s(s|o(s|m(s|es(omes))(s|t(s|r(s|i(s|ns)))|o(s|ms)))) )(2|o(3|m(4 |e(1|s(omes)(5|t(6| r(7|i(8|n9)))|o( 3|m(4|e1))))))))( s(s|o (s|m(s|es(omes)(s|t(s|r(s|i(s|ns)))|o(s|ms)))))(o( (saya?)?|mes(omes)*(t(r?|rin?)|o(saya?)?)?))?)?)$
Ini memastikan bahawa regex hanya menangkap bahagian selepas garis miring ke belakang ketiga.
Menangkap Ketiga-tiga Bahagian
Penyelesaian alternatif menangkap ketiga-tiga bahagian yang anda minati. Selepas menyemak nilai kumpulan tangkap #1, anda boleh memutuskan perkara yang akan dikembalikan:
package main import ( "fmt" "regexp" ) func main() { s := "anything/anything/somestring" r := regexp.MustCompile(`^[^/]+/[^/]+/(.*)`) val := r.FindStringSubmatch(s) // fmt.Println(val[1]) // -> somestring if len(val) > 1 && val[1] != "somestring" { // val has more than 1 element and is not equal to somestring? fmt.Println(val[1]) // Use val[1] } else { fmt.Println("No match") // Else, report no match } }
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menggunakan Go Regexp untuk Memadankan Semuanya Kecuali Rentetan Tertentu?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!