match.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package utility
  2. import (
  3. "fmt"
  4. "strings"
  5. )
  6. // TrieNode represents each node in the Trie
  7. type TrieNode struct {
  8. children map[rune]*TrieNode
  9. isEnd bool
  10. }
  11. // NewTrieNode creates a new TrieNode
  12. func NewTrieNode() *TrieNode {
  13. return &TrieNode{
  14. children: make(map[rune]*TrieNode),
  15. isEnd: false,
  16. }
  17. }
  18. // 批量追加词
  19. func (n *TrieNode) Insert(words ...string) {
  20. for _, word := range words {
  21. node := n
  22. for _, char := range word {
  23. if _, ok := node.children[char]; !ok {
  24. node.children[char] = NewTrieNode()
  25. }
  26. node = node.children[char]
  27. }
  28. node.isEnd = true
  29. }
  30. }
  31. // 前缀树替换所有
  32. func (n *TrieNode) ReplaceAll(text, str string) string {
  33. var rs = []rune(text)
  34. var sb = new(strings.Builder)
  35. var lastPos = 0
  36. for i := 0; i < len(rs); i++ {
  37. node := n
  38. for j := i; j < len(rs); j++ {
  39. char := rs[j]
  40. if _, ok := node.children[char]; !ok {
  41. break
  42. }
  43. node = node.children[char]
  44. if node.isEnd {
  45. //前部分
  46. sb.WriteString(string(rs[lastPos:i]))
  47. sb.WriteString(fmt.Sprintf(" %s ", str))
  48. lastPos = j + 1
  49. i = j
  50. break
  51. }
  52. }
  53. }
  54. if lastPos == 0 { //修正全文未匹配情况
  55. return text
  56. } else if lastPos < len(rs) { //修正最后截取尾巴部分
  57. sb.WriteString(string(rs[lastPos:]))
  58. }
  59. return sb.String()
  60. }