为了账号安全,请及时绑定邮箱和手机立即绑定

如何在golang中实现正则表达式的不匹配?

如何在golang中实现正则表达式的不匹配?

Go
噜噜哒 2022-10-17 16:56:22
这是一个选择题示例。我想在golang的以下代码内容中获取“英国、法国”、“加拿大、墨西哥”、“葡萄牙、加拿大”、“印度、德国”等中文文本,但它不起作用。package mainimport (    "fmt"    "regexp"    "testing")func TestRegex(t *testing.T) {    text := `( B )38.目前,亚马逊美国站后台,除了有美国站点外,还有(    )站点。A.英国、法国B.加拿大、墨西哥C.葡萄牙、加拿大D.墨西哥、德国`    fmt.Printf("%q\n", regexp.MustCompile(`[A-E]\.(\S+)?`).FindAllStringSubmatch(text, -1))    fmt.Printf("%q\n", regexp.MustCompile(`[A-E]\.`).Split(text, -1))}文本:( B )38.目前,亚马逊美国站后台,除了有美国站点外,还有(    )站点。A.英国、法国B.加拿大、墨西哥C.葡萄牙、加拿大D.墨西哥、德国图案:[A-E]\.(\S+)?实际结果:[["A.英国、法国B.加拿大、墨西哥" "英国、法国B.加拿大、墨西哥"] ["C.葡萄牙、加拿大D.墨西哥、德国" "葡萄牙、加拿大D.墨西哥、德国"]]。预期结果:[["A.英国、法国" "英国、法国"] ["B.加拿大、墨西哥" "加拿大、墨西哥"] ["C.葡萄牙、加拿大" "葡萄牙、加拿大"] ["D.墨西哥、德国" "墨西哥、德国"]]我认为这可能是一个贪婪模式问题。因为在我的代码中,它直接将选项 A 和选项 B 读取为一个选项。
查看完整描述

1 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

非贪心匹配不能解决这个问题,你需要正向前瞻,而re2不支持。


作为一种解决方法,可以只搜索标签并手动提取其间的文本。


re := regexp.MustCompile(`[A-E]\.`)

res := re.FindAllStringIndex(text, -1)

results := make([][]string, len(res))

for i, m := range res {

    if i < len(res)-1 {

        results[i] = []string{text[m[0]:m[1]], text[m[1]:res[i+1][0]]}

    } else {

        results[i] = []string{text[m[0]:m[1]], text[m[1]:]}

    }

}


fmt.Printf("%q\n", results)

应该打印


[["A." "英国、法国"] ["B." "加拿大、墨西哥\n"] ["C." "葡萄牙、加拿大"] ["D." "墨西哥、德国\n"]]


查看完整回答
反对 回复 2022-10-17
  • 1 回答
  • 0 关注
  • 128 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号