首頁  >  文章  >  後端開發  >  Go Regexp:符合完整單字或子字串或根本不匹配

Go Regexp:符合完整單字或子字串或根本不匹配

WBOY
WBOY轉載
2024-02-08 20:51:041048瀏覽

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

問題內容

我正在嘗試找到一種使用 Go 將模式與 regexp.Regexp 進行匹配的方法。

比賽的標準如下:

  1. 它必須符合 FooBar 或其子字串 Foo 在行的開頭,或完全不符。
  2. 如果在 #1 中匹配,則任何一個匹配後面都必須有其他字元(即 \S

所以,它應該要匹配,例如:

  • 符合:FooABC
  • #符合:FooBarABC
  • 不符:FooBar(因為後面沒有其他字元)
  • 不符:ABC(因為它不是以 Foo 開頭)

我嘗試了各種表達方式,但似乎無法理解它。

我發現其他實作中存在負向先行模式,但Go似乎沒有提供它。有沒有其他方法可以解決這個問題?

請參閱(已更新):https://regex101.com/r/SWSTzv/3

我知道這顯然可以在不使用 regexp 的情況下解決。然而,這個請求的目的是了解這個問題是否可以透過 Go 的 stdlib 實作來解決。


正確答案


為什麼不直接反轉與正規表示式^Foo(?:Bar)?$ 相符的結果(好吧,不只是)?

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

輸出:

<code>FooA
FooB
FooBa
FooBax
FooBxr
FooBarAbc
FooBarFoo
</code>

rextester 上嘗試。

更新
一種更基於正規表示式並使用技巧 em>.

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

rextester 上嘗試。

以上是Go Regexp:符合完整單字或子字串或根本不匹配的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除