首頁 > 後端開發 > Golang > 主體

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

WBOY
發布: 2024-02-08 20:51:04
轉載
1103 人瀏覽過

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 上嘗試。

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

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
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板