Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Saya Boleh Menggunakan Go Regexp untuk Memadankan Semuanya Kecuali Rentetan Tertentu?

Bagaimanakah Saya Boleh Menggunakan Go Regexp untuk Memadankan Semuanya Kecuali Rentetan Tertentu?

Barbara Streisand
Lepaskan: 2024-12-24 14:12:15
asal
245 orang telah melayarinya

How Can I Use Go Regexp to Match Everything Except a Specific String?

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 "" dalam hasil regex asal anda:

/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
    }
}
Salin selepas log masuk

  1. s
  2. os
  3. ms
  4. es
  5. ost
  6. rs
  7. ialah
  8. ns
  9. gs
  10. /

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!

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