gpt4 book ai didi

regex - Golang 正则表达式匹配关键字对之间的多个模式

转载 作者:IT王子 更新时间:2023-10-29 02:04:12 25 4
gpt4 key购买 nike

我有一个包含两个关键字的字符串:“CURRENT NAME(S)”和“NEW NAME(S)”,每个关键字后面都跟着一堆单词。我想提取这些关键字之外的那些词组。用代码详细说明:

    s := `"CURRENT NAME(S)
Name1, Name2",,"NEW NAME(S)
NewName1,NewName2"`
re := regexp.MustCompile(`"CURRENT NAME(S).*",,"NEW NAME(S).*"`)

segs := re.FindAllString(s, -1)
fmt.Println("segs:", segs)

segs2 := re.FindAllStringSubmatch(s, -1)
fmt.Println("segs2:", segs2)

如您所见,字符串“s”具有输入。 “Name1,Name2”是当前名称列表,“NewName1, NewName2”是新名称列表。我想提取这两个列表。这两个列表以逗号分隔。每个关键字都以双引号开头,当它们对应的双引号结束时,它们的范围结束。

如何使用正则表达式使得程序可以打印“Name1, Name2”和“NewName1,NewName2”?

最佳答案

您的正则表达式的问题是输入字符串包含换行符,而 Go 正则表达式中的 . 不匹配换行符。另一个问题是 .* 是一个贪婪模式,它将匹配尽可能多的符号,直到 last 第二个关键字。此外,您需要转义正则表达式模式中的括号以匹配 () 文字符号。

解决这个问题最好的方法是把.*改成一个取反的字符类模式[^"]*,放在一对非转义字符中() 形成一个捕获组(从匹配中获取子匹配的构造)。

这是一个Go demo :

package main

import (
"fmt"
"regexp"
)

func main() {
s := `"CURRENT NAME(S)
Name1, Name2",,"NEW NAME(S)
NewName1,NewName2"`
re := regexp.MustCompile(`"CURRENT NAME\(S\)\s*([^"]*)",,"NEW NAME\(S\)\s*([^"]*)"`)

segs2 := re.FindAllStringSubmatch(s,-1)
fmt.Printf("segs2: [%s; %s]", segs2[0][1], segs2[0][2])
}

现在,正则表达式匹配:

  • "CURRENT NAME\(S\) - 文字字符串"CURRENT NAME(S)`
  • \s* - 零个或多个空格
  • ([^"]*) - 第 1 组捕获 "以外的 0+ 个字符
  • ","NEW NAME\(S\) - 文字字符串 ",,"NEW NAME(S)
  • \s* - 零个或多个空格
  • ([^"]*) - 第 2 组捕获 "以外的 0+ 个字符
  • " - 文字 "

关于regex - Golang 正则表达式匹配关键字对之间的多个模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38561188/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com