Home >Backend Development >Golang >How Can I Use Go Regexp to Match Everything Except a Specific String?
Can I Find Everything Except a Certain String Using Go Regexp?
As many similar questions have shown, matching against a specific string using Go regular expressions can be challenging. This question asks how to match against a string in the format "anything/anything/somestring," but exclude strings containing "somestring."
The pattern "/././(.)" would match "somestring," but we want to match everything except it. Most proposed solutions use "/././((?!somestring).)," which is not valid in Go regexp because it contains a non-quantifiable token.
Go's regexp module doesn't support lookaheads to ensure linear execution time (O(n)) limits. Therefore, workarounds are necessary.
Web Service for Negated Patterns
One approach is to use the non-match-regex web service to generate negated patterns compatible with POSIX. For "somestring," the generated pattern is:
^(1|s(s|o(s|m(s|es(omes)(s|t(s|r(s|i(s|ns)))|o(s|ms)))))(2|o(3|m(4|e(1|s(omes)(5|t(6|r(7|i(8|n9)))|o(3|m(4|e1))))))))(s(s|o(s|m(s|es(omes)(s|t(s|r(s|i(s|ns)))|o(s|ms)))))(o((me?)?|mes(omes)*(t(r?|rin?)|o(me?)?)?))?)?$
Replacing the last "(.*)" with "
/10/10/((1|s(s|o(s|m(s|es(omes)(s|t(s|r(s|i(s|ns)))|o(s|ms)))))(2|o(3|m(4|e(1|s(omes)(5|t(6|r(7|i(8|n9)))|o(3|m(4|e1))))))))(s(s|o(s|m(s|es(omes)(s|t(s|r(s|i(s|ns)))|o(s|ms)))))(o((me?)?|mes(omes)*(t(r?|rin?)|o(me?)?)?))?)?)$
This ensures that the regex only captures the part after the third backslash.
Capturing All Three Parts
An alternative solution captures all three parts you're interested in. After checking the capture group #1 value, you can decide what to return:
package main import ( "fmt" "regexp" ) func main() { s := "anything/anything/somestring" r := regexp.MustCompile(`^[^/]+/[^/]+/(.*)`) val := r.FindStringSubmatch(s) // fmt.Println(val[1]) // -> somestring if len(val) > 1 && val[1] != "somestring" { // val has more than 1 element and is not equal to somestring? fmt.Println(val[1]) // Use val[1] } else { fmt.Println("No match") // Else, report no match } }
The above is the detailed content of How Can I Use Go Regexp to Match Everything Except a Specific String?. For more information, please follow other related articles on the PHP Chinese website!