我正在嘗試找到一種使用 Go 將模式與 regexp.Regexp
進行匹配的方法。
比賽的標準如下:
FooBar
或其子字串 Foo
在行的開頭,或完全不符。 \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中文網其他相關文章!