regex - 使用正则表达式将字符串包含到另一个字符串中
问题描述
我有一些字符串。字符串可能在方括号之间列出了项目。我想在带括号的字符串中包含恒定数量的额外项目。括号可能为空或不存在。例如:
- string1 --> string1 # 什么都不加
- string2[] --> string2[extra1="1",extra2="2"] # 添加两项
- string3[item="1"] --> string3[item="1",extra1="1",extra2="2"] # 添加两项
目前我使用以下代码(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"]
在空括号的情况下是否可以避免粘贴逗号?
当然可以再次解析字符串并修剪逗号,但这似乎不是最理想的。
解决方案
您可以有两个正则表达式,其中一个匹配空 [],另一个匹配带有 [] 内的文本的字符串。下面是经过测试的代码 - 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)
}
}