Home >Backend Development >Golang >How Can I Use Go Regexp to Match Everything Except a Specific String?

How Can I Use Go Regexp to Match Everything Except a Specific String?

Barbara Streisand
Barbara StreisandOriginal
2024-12-24 14:12:15258browse

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 "" in your original regex yields:

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

  1. s
  2. os
  3. ms
  4. es
  5. ost
  6. rs
  7. is
  8. ns
  9. gs
  10. /

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!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn