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
Barbara Streisandasal
2024-12-24 14:12:15282semak imbas

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
    }
}

  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!

Kenyataan:
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