github.com/zhongdalu/gf@v1.0.0/g/text/gregex/gregex.go (about) 1 // Copyright 2017-2018 gf Author(https://github.com/zhongdalu/gf). All Rights Reserved. 2 // 3 // This Source Code Form is subject to the terms of the MIT License. 4 // If a copy of the MIT was not distributed with this file, 5 // You can obtain one at https://github.com/zhongdalu/gf. 6 7 // Package gregex provides high performance API for regular expression functionality. 8 package gregex 9 10 import ( 11 "regexp" 12 ) 13 14 // Quote quotes <s> by replacing special chars in <s> 15 // to match the rules of regular expression pattern. 16 // And returns the copy. 17 // 18 // Eg: Quote(`[foo]`) returns `\[foo\]`. 19 func Quote(s string) string { 20 return regexp.QuoteMeta(s) 21 } 22 23 // Validate checks whether given regular expression pattern <pattern> valid. 24 func Validate(pattern string) error { 25 _, err := getRegexp(pattern) 26 return err 27 } 28 29 // IsMatch checks whether given bytes <src> matches <pattern>. 30 func IsMatch(pattern string, src []byte) bool { 31 if r, err := getRegexp(pattern); err == nil { 32 return r.Match(src) 33 } 34 return false 35 } 36 37 // IsMatchString checks whether given string <src> matches <pattern>. 38 func IsMatchString(pattern string, src string) bool { 39 return IsMatch(pattern, []byte(src)) 40 } 41 42 // MatchString return bytes slice that matched <pattern>. 43 func Match(pattern string, src []byte) ([][]byte, error) { 44 if r, err := getRegexp(pattern); err == nil { 45 return r.FindSubmatch(src), nil 46 } else { 47 return nil, err 48 } 49 } 50 51 // MatchString return strings that matched <pattern>. 52 func MatchString(pattern string, src string) ([]string, error) { 53 if r, err := getRegexp(pattern); err == nil { 54 return r.FindStringSubmatch(src), nil 55 } else { 56 return nil, err 57 } 58 } 59 60 // MatchAll return all bytes slices that matched <pattern>. 61 func MatchAll(pattern string, src []byte) ([][][]byte, error) { 62 if r, err := getRegexp(pattern); err == nil { 63 return r.FindAllSubmatch(src, -1), nil 64 } else { 65 return nil, err 66 } 67 } 68 69 // MatchAllString return all strings that matched <pattern>. 70 func MatchAllString(pattern string, src string) ([][]string, error) { 71 if r, err := getRegexp(pattern); err == nil { 72 return r.FindAllStringSubmatch(src, -1), nil 73 } else { 74 return nil, err 75 } 76 } 77 78 // ReplaceString replace all matched <pattern> in bytes <src> with bytes <replace>. 79 func Replace(pattern string, replace, src []byte) ([]byte, error) { 80 if r, err := getRegexp(pattern); err == nil { 81 return r.ReplaceAll(src, replace), nil 82 } else { 83 return nil, err 84 } 85 } 86 87 // ReplaceString replace all matched <pattern> in string <src> with string <replace>. 88 func ReplaceString(pattern, replace, src string) (string, error) { 89 r, e := Replace(pattern, []byte(replace), []byte(src)) 90 return string(r), e 91 } 92 93 // ReplaceFunc replace all matched <pattern> in bytes <src> 94 // with custom replacement function <replaceFunc>. 95 func ReplaceFunc(pattern string, src []byte, replaceFunc func(b []byte) []byte) ([]byte, error) { 96 if r, err := getRegexp(pattern); err == nil { 97 return r.ReplaceAllFunc(src, replaceFunc), nil 98 } else { 99 return nil, err 100 } 101 } 102 103 // ReplaceFunc replace all matched <pattern> in bytes <src> 104 // with custom replacement function <replaceFunc>. 105 // The parameter <match> type for <replaceFunc> is [][]byte, 106 // which is the result contains all sub-patterns of <pattern> using Match function. 107 func ReplaceFuncMatch(pattern string, src []byte, replaceFunc func(match [][]byte) []byte) ([]byte, error) { 108 if r, err := getRegexp(pattern); err == nil { 109 return r.ReplaceAllFunc(src, func(bytes []byte) []byte { 110 match, _ := Match(pattern, src) 111 return replaceFunc(match) 112 }), nil 113 } else { 114 return nil, err 115 } 116 } 117 118 // ReplaceStringFunc replace all matched <pattern> in string <src> 119 // with custom replacement function <replaceFunc>. 120 func ReplaceStringFunc(pattern string, src string, replaceFunc func(s string) string) (string, error) { 121 bytes, err := ReplaceFunc(pattern, []byte(src), func(bytes []byte) []byte { 122 return []byte(replaceFunc(string(bytes))) 123 }) 124 return string(bytes), err 125 } 126 127 // ReplaceStringFuncMatch replace all matched <pattern> in string <src> 128 // with custom replacement function <replaceFunc>. 129 // The parameter <match> type for <replaceFunc> is []string, 130 // which is the result contains all sub-patterns of <pattern> using MatchString function. 131 func ReplaceStringFuncMatch(pattern string, src string, replaceFunc func(match []string) string) (string, error) { 132 if r, err := getRegexp(pattern); err == nil { 133 return string(r.ReplaceAllFunc([]byte(src), func(bytes []byte) []byte { 134 match, _ := MatchString(pattern, src) 135 return []byte(replaceFunc(match)) 136 })), nil 137 } else { 138 return "", err 139 } 140 } 141 142 // Split slices <src> into substrings separated by the expression and returns a slice of 143 // the substrings between those expression matches. 144 func Split(pattern string, src string) []string { 145 if r, err := getRegexp(pattern); err == nil { 146 return r.Split(src, -1) 147 } 148 return nil 149 }