首页 >后端开发 >Golang >如何在没有 Lookaround 的情况下有效地在 Go 正则表达式中进行负匹配?

如何在没有 Lookaround 的情况下有效地在 Go 正则表达式中进行负匹配?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-20 12:39:09465浏览

How Can I Effectively Perform Negative Matching in Go Regular Expressions Without Lookarounds?

Go 正则表达式中的负匹配

在 Go 正则表达式中,由于缺乏环视构造,匹配除特定常量字符串之外的所有内容可能具有挑战性.

原创RegExp:

提供的正则表达式 /.*/.*/(.*) 匹配三个反斜杠之后的所有内容。但是,它不排除包含“somestring”的字符串。

否定方法

方法1:Web服务

一解决方法涉及使用生成 POSIX 兼容否定模式的 Web 服务。对于“somestring”,这会生成一个复杂的模式,可以替换为原始正则表达式:

/[^/]*/[^/]*/^([^s]|s(s|o(s|m(s|es(omes)*(s|t(s|r(s|i(s|ns)))|o(s|ms)))))*([^os]|o([^ms]|m([^es]|e([^s]|s(omes)*([^ost]|t([^rs]|r([^is]|i([^ns]|n[^gs])))|o([^ms]|m([^es]|e[^s]))))))))*(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?)?)?))?)?$

方法 2:字符类

而不是使用 .* ,以下表达式使用否定字符类 [^/]:

`[^/]+/[^/]+/(.*)`

这与第三个之前的任何内容匹配反斜杠,但它不排除带有“somestring”的字符串。

使用捕获组的解决方法

由于 RE2(Go 使用的)不支持前瞻,我们可以捕获字符串的所有三个部分,并检查捕获组提取的值:

import (
    "fmt"
    "regexp"
)

func main() {
    s := "anything/anything/somestring"
    r := regexp.MustCompile(`^[^/]+/[^/]+/(.*)`)
    val := r.FindStringSubmatch(s)
    if len(val) > 1 && val[1] != "somestring" {
        fmt.Println(val[1])
    } else {
        fmt.Println("No match")
    }
}

此方法捕获匹配的值并在它们与“somestring”不匹配时打印它们。

以上是如何在没有 Lookaround 的情况下有效地在 Go 正则表达式中进行负匹配?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn