登录
首页 >  Golang >  Go问答

使用正则表达式进行单词或子字符串的完整匹配或不匹配

来源:stackoverflow

时间:2024-02-02 08:21:59 109浏览 收藏

编程并不是一个机械性的工作,而是需要有思考,有创新的工作,语法是固定的,但解决问题的思路则是依靠人的思维,这就需要我们坚持学习和更新自己的知识。今天golang学习网就整理分享《使用正则表达式进行单词或子字符串的完整匹配或不匹配》,文章讲解的知识点主要包括,如果你对Golang方面的知识点感兴趣,就不要错过golang学习网,在这可以对大家的知识积累有所帮助,助力开发能力的提升。

问题内容

我正在尝试找到一种使用 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)
    }
  }
}

输出:

FooA
FooB
FooBa
FooBax
FooBxr
FooBarAbc
FooBarFoo

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 上尝试一下。

本篇关于《使用正则表达式进行单词或子字符串的完整匹配或不匹配》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>