You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用正则表达式区分双引号与非双引号字符串并解析插件参数?

解决插件参数解析的正则匹配问题

从你的代码和测试案例来看,当前的实现没法正确处理跨原列表元素的双引号内容,而且正则的匹配范围太窄,只能覆盖引号后带数字的场景。咱们来调整下解析逻辑,搞定这个问题:

核心思路

  1. 先把分割后的参数列表合并成完整字符串(这一步你已经做对了)
  2. 用一个能同时匹配双引号包裹内容和非引号连续字符的正则,确保所有有效参数都被捕获
  3. 把捕获到的内容分类,按你的需求返回结果

修正后的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
}

测试你的案例

  1. 输入["\"random", "token\""]

    • 合并后是"random token",正则匹配到双引号内的random token
    • 返回结果:"random token", "", true,符合预期
  2. 输入["\"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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:38:40