Rumah > pembangunan bahagian belakang > Golang > Pergi Regexp: Padankan perkataan penuh atau subrentetan atau tidak sama sekali

Pergi Regexp: Padankan perkataan penuh atau subrentetan atau tidak sama sekali

WBOY
Lepaskan: 2024-02-08 20:51:04
ke hadapan
1105 orang telah melayarinya

Go Regexp:匹配完整单词或子字符串或根本不匹配

Kandungan soalan

Saya cuba mencari cara untuk memadankan corak dengan regexp.Regexp menggunakan Go.

Kriteria pertandingan adalah seperti berikut:

  1. Ia mesti sepadan dengan FooBar 或其子字符串 Foo di awal baris, atau tidak sama sekali.
  2. Jika sepadan dalam #1, mana-mana perlawanan mesti diikuti oleh watak lain (iaitu S+)

Jadi, ia sepatutnya sepadan, contohnya:

  • Perlawanan: FooABC
  • Perlawanan: FooBarABC
  • Tidak sepadan: FooBar (kerana tiada watak lain selepasnya)
  • Tidak sepadan: bermula dengan ABC(因为它不是以 Foo)

Saya telah mencuba pelbagai ungkapan tetapi seperti tidak dapat memahaminya.

Saya mendapati bahawa mod pandangan ke hadapan negatif wujud dalam pelaksanaan lain, tetapi Go nampaknya tidak menyediakannya. Adakah terdapat cara lain untuk menyelesaikan masalah ini?

Lihat (dikemas kini): https://regex101.com/r/SWSTzv/3

Saya tahu ini jelas boleh diselesaikan tanpa menggunakan regexp. Walau bagaimanapun, tujuan permintaan ini adalah untuk memahami sama ada masalah ini boleh diselesaikan dengan pelaksanaan stdlib Go. regexp 的情况下解决。然而,这个请求的目的是了解这个问题是否可以通过 Go 的 stdlib 实现来解决。


正确答案


为什么不直接反转与正则表达式 ^Foo(?:Bar)?$

Jawapan betul

Kenapa tidak terbalikkan sahaja hasil yang sepadan dengan ungkapan biasa ^Foo(?:Bar)?$ (well, Not just )?

package main

import (
  "fmt"
  "regexp"
  "strings"
)

func main() {
  re := regexp.MustCompile(`^Foo(?:Bar)?$`)
  str := `Foo
FooBar
FooA
FooB
FooBa
FooBax
FooBxr
FooBarAbc
FooBarFoo
ABC
AbcFooBar`

  for _, s := range strings.Split(str, "\n") {
    if strings.HasPrefix(s, "Foo") && !re.MatchString(s) {
      fmt.Println(s)
    }
  }
}
Salin selepas log masuk
Keluaran:
<code>FooA
FooB
FooBa
FooBax
FooBxr
FooBarAbc
FooBarFoo
</code>
Salin selepas log masuk

Cuba pada rextester.
Kemas kini Satu lagi berdasarkan ungkapan biasa dan menggunakan

petua

.

package main

import (
  "fmt"
  "regexp"
  "strings"
)

func main() {
  re := regexp.MustCompile(`^Foo$|^FooBar$|^(Foo.+)`)
  str := `Foo
FooBar
FooA
FooB
FooBa
FooBax
FooBxr
FooBarAbc
FooBarFoo
ABC
AbcFooBar`

  for _, s := range strings.Split(str, "\n") {
    submatches := re.FindStringSubmatch(s)
    if submatches != nil && submatches[1] != "" {
      fmt.Println(submatches[1])
    }
  }
}
Salin selepas log masuk

Cuba pada 🎜rextester🎜. 🎜

Atas ialah kandungan terperinci Pergi Regexp: Padankan perkataan penuh atau subrentetan atau tidak sama sekali. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan