Golang正则匹配错误无法正确提取选择题选项该如何解决?
问题原因
你原来的正则[A-E]\.(\S+)?中,\S匹配所有非空白字符,作为选项标记的大写字母B/C/D也属于非空白字符,因此匹配会持续到行尾的换行符位置,将相邻选项内容吞入匹配结果,不是单纯的贪婪模式问题,是匹配终止条件设置错误。
解决方案
根据你的场景(选项内容仅包含中文和顿号),可以使用限制匹配范围的正则实现正确提取:
package main import ( "fmt" "regexp" "testing" ) func TestRegex(t *testing.T) { text := `( B )38.目前,亚马逊美国站后台,除了有美国站点外,还有( )站点。 A.英国、法国B.加拿大、墨西哥 C.葡萄牙、加拿大D.墨西哥、德国 ` // 调整后的正则:匹配A-E加.,后面捕获所有中文和顿号 reg := regexp.MustCompile(`[A-E]\.([\p{Han}、]+)`) result := reg.FindAllStringSubmatch(text, -1) fmt.Printf("%q\n", result) }
运行结果
输出完全符合你的预期:
[["A.英国、法国" "英国、法国"] ["B.加拿大、墨西哥" "加拿大、墨西哥"] ["C.葡萄牙、加拿大" "葡萄牙、加拿大"] ["D.墨西哥、德国" "墨西哥、德国"]]
通用场景适配
如果你的选项可能包含数字、英文等其他字符(不会出现A./B.这类选项标记格式的内容),可以用支持正向预查的正则(Golang RE2引擎已支持正向预查):
reg := regexp.MustCompile(`[A-E]\.(.*?)(?=[A-E]\.|$)`)
这个正则会匹配A-E加.之后的内容,直到下一个选项标记或者文本结束为止,适配更多内容格式的选项提取。
内容的提问来源于stack exchange,提问作者Carmel
相关产品推荐
相关产品推荐

