如何用正则表达式区分双引号与非双引号字符串并解析插件参数?
解决插件参数解析的正则匹配问题
从你的代码和测试案例来看,当前的实现没法正确处理跨原列表元素的双引号内容,而且正则的匹配范围太窄,只能覆盖引号后带数字的场景。咱们来调整下解析逻辑,搞定这个问题:
核心思路
- 先把分割后的参数列表合并成完整字符串(这一步你已经做对了)
- 用一个能同时匹配双引号包裹内容和非引号连续字符的正则,确保所有有效参数都被捕获
- 把捕获到的内容分类,按你的需求返回结果
修正后的Go代码
import ( "regexp" "strings" ) func parseParameters(parameters []string) (string, string, bool) { // 合并参数为完整字符串 paramString := strings.Join(parameters, " ") // 编译正则:匹配双引号内的内容,或者非空格的连续字符 // 解释下: // - "(.*?)":匹配双引号包裹的任意内容(非贪婪模式,不会跨多个引号匹配) // - |:表示“或”的逻辑 // - (\S+):匹配连续的非空格字符,比如数字、不带空格的字符串 re := regexp.MustCompile(`"(.*?)"|(\S+)`) matches := re.FindAllStringSubmatch(paramString, -1) if len(matches) == 0 { return "", "", false } var doubleQuotedContent string var nonQuotedContent string // 遍历所有匹配结果,区分类型 for _, match := range matches { // match[1]是双引号内的内容,match[2]是非引号参数 if match[1] != "" { doubleQuotedContent = match[1] // 如果要支持多个双引号参数,换成切片收集就行:doubleQuotedList = append(doubleQuotedList, match[1]) } else if match[2] != "" { nonQuotedContent = match[2] } } return doubleQuotedContent, nonQuotedContent, true }
测试你的案例
输入
["\"random", "token\""]- 合并后是
"random token",正则匹配到双引号内的random token - 返回结果:
"random token", "", true,符合预期
- 合并后是
输入
["\"random", "token\"", "45"]- 合并后是
"random token" 45,正则分别匹配到random token和45 - 返回结果:
"random token", "45", true,完全符合你的要求
- 合并后是
扩展支持多参数场景
如果你的插件需要支持多个双引号参数(比如你提到的"random token" "random token" 34 "randomtoken"),可以改成返回切片的版本,更灵活:
func parseParameters(parameters []string) ([]string, []string, bool) { paramString := strings.Join(parameters, " ") re := regexp.MustCompile(`"(.*?)"|(\S+)`) matches := re.FindAllStringSubmatch(paramString, -1) if len(matches) == 0 { return nil, nil, false } var doubleQuotedList []string var nonQuotedList []string for _, match := range matches { if match[1] != "" { doubleQuotedList = append(doubleQuotedList, match[1]) } else if match[2] != "" { nonQuotedList = append(nonQuotedList, match[2]) } } return doubleQuotedList, nonQuotedList, true }
这个版本会把所有双引号内容和非引号参数分别收集到两个切片里,方便你后续处理。
内容的提问来源于stack exchange,提问作者Ninja
相关产品推荐
相关产品推荐

