首页 > 解决方案 > 使用正则表达式将字符串包含到另一个字符串中

问题描述

我有一些字符串。字符串可能在方括号之间列出了项目。我想在带括号的字符串中包含恒定数量的额外项目。括号可能为空或不存在。例如:

目前我使用以下代码(Golang)实现了这一点:

str1 := "test"
str2 := `test[]`
str3 := `test[item1="1"]`
    
re := regexp.MustCompile(`\[(.+)?\]`)

for _, s := range []string{str1, str2, str3} {
    s = re.ReplaceAllString(s, fmt.Sprintf(`[item1="a",item2="b",$1]`))
    fmt.Println(s)
}

但是在输出中,如果括号为空,最后我还会得到一个不需要的逗号“,”:

test
test[item1="a",item2="b",]
test[item1="a",item2="b",item1="1"]

在空括号的情况下是否可以避免粘贴逗号?

当然可以再次解析字符串并修剪逗号,但这似乎不是最理想的。

Go 操场上的代码示例

标签: regexgo

解决方案


您可以有两个正则表达式,其中一个匹配空 [],另一个匹配带有 [] 内的文本的字符串。下面是经过测试的代码 - https://play.golang.org/p/_DOOGDMUOCm

第二种方法是在替换它后回顾字符串。如果最后两个字符是 ,] 并且您可以子串 until 并添加 ]。我想你已经知道这种方法了。

package main

import (
    "fmt"
    "regexp"
)

func main() {
    str1 := "test"
    str2 := `test[]`
    str3 := `test[item1="1"]`
    
    re := regexp.MustCompile(`\[(.*)\]`)

    for _, s := range []string{str1, str2, str3} {
       matched,err := regexp.Match(`\[(.+)\]`, []byte(s));
       _ = err;
       if(matched==true){
          s = re.ReplaceAllString(s, fmt.Sprintf(`[item1="a",item2="b",$1]`));
       }else {
          s = re.ReplaceAllString(s, fmt.Sprintf(`[item1="a",item2="b"]`));
       }
       fmt.Println(s)
    }
}

推荐阅读