1 Star 0 Fork 0

yangtxiang/mg-fw

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
str_find.go 1.79 KB
一键复制 编辑 原始数据 按行查看 历史
yangtxiang 提交于 2024-04-08 17:48 +08:00 . fix bug
package utils
import (
"fmt"
"strings"
)
type SubStrIndex struct {
Sub string
StartIdx int
EndIdx int
}
func (si *SubStrIndex) String() string {
return fmt.Sprintf("{ sub=%s, start=%d,end=%d }", si.Sub, si.StartIdx, si.EndIdx)
}
type SubReplacer func(sub string) string
func StrSearchSubs(str string, startStr, endStr string) []*SubStrIndex {
scanner := NewStrScanner(str)
startLen := len(startStr)
endLen := len(endStr)
nodeStack := make([]*SubStrIndex, 0)
readBuf := strings.Builder{}
result := make([]*SubStrIndex, 0)
for scanner.Next() {
testStart := scanner.Read(startLen)
testEnd := scanner.Read(endLen)
if testStart == startStr {
// 开始
nodeStack = append(nodeStack, &SubStrIndex{
Sub: "",
StartIdx: scanner.Current() + startLen,
EndIdx: -1,
})
readBuf = strings.Builder{}
scanner.Inc(startLen - 1)
} else if testEnd == endStr {
if len(nodeStack) == 0 {
readBuf = strings.Builder{}
} else {
node := nodeStack[len(nodeStack)-1]
nodeStack = nodeStack[:len(nodeStack)-1]
node.Sub = readBuf.String()
node.EndIdx = scanner.Current()
readBuf = strings.Builder{}
result = append(result, node)
scanner.Inc(endLen - 1)
}
} else {
c := scanner.ReadRune()
if c != nil {
readBuf.WriteRune(*c)
}
}
}
return result
}
func StrReplaceSearch(str string, startStr, endStr string, replace SubReplacer) string {
items := StrSearchSubs(str, startStr, endStr)
buf := []rune(str)
result := strings.Builder{}
startLen := len(startStr)
endLen := len(endStr)
i := 0
for _, r := range items {
s := replace(r.Sub)
if r.StartIdx > i {
result.WriteString(string(buf[i : r.StartIdx-startLen]))
}
i = r.EndIdx + endLen
result.WriteString(s)
}
result.WriteString(string(buf[i:]))
return result.String()
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/maglsoft/mg-fw.git
git@gitee.com:maglsoft/mg-fw.git
maglsoft
mg-fw
mg-fw
v0.0.5

搜索帮助