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

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

WBOY
WBOYke hadapan
2024-02-08 20:51:041048semak imbas

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)
    }
  }
}
Keluaran:
<code>FooA
FooB
FooBa
FooBax
FooBxr
FooBarAbc
FooBarFoo
</code>

Cuba pada rextester.
Kemas kini em> 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])
    }
  }
}

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam