mirror of
https://github.com/duke-git/lancet.git
synced 2026-03-01 00:35:28 +08:00
Compare commits
2 Commits
f9e5ec9096
...
90e5a0bfb2
| Author | SHA1 | Date | |
|---|---|---|---|
| 90e5a0bfb2 | |||
| 93be25920f |
@@ -66,6 +66,9 @@ import (
|
|||||||
- [Ellipsis](#Ellipsis)
|
- [Ellipsis](#Ellipsis)
|
||||||
- [Shuffle](#Shuffle)
|
- [Shuffle](#Shuffle)
|
||||||
- [Rotate](#Rotate)
|
- [Rotate](#Rotate)
|
||||||
|
- [TemplateReplace](#TemplateReplace)
|
||||||
|
- [RegexMatchAllGroups](#RegexMatchAllGroups)
|
||||||
|
|
||||||
|
|
||||||
<div STYLE="page-break-after: always;"></div>
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
@@ -1659,3 +1662,70 @@ func main() {
|
|||||||
// loHel
|
// loHel
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### <span id="TemplateReplace">TemplateReplace</span>
|
||||||
|
|
||||||
|
<p>将模板字符串中的占位符替换为数据映射中的相应值。占位符括在花括号中,例如 {key}。例如,模板字符串为“Hello, {name}!”,数据映射为{"name": "world"},结果将为“Hello, world!”。</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func TemplateReplace(template string, data map[string]string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>示例:<span style="float:right;display:inline-block;">[运行]()</span></b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
template := `Hello, my name is {name}, I'm {age} years old.`
|
||||||
|
data := map[string]string{
|
||||||
|
"name": "Bob",
|
||||||
|
"age": "20",
|
||||||
|
}
|
||||||
|
|
||||||
|
result := strutil.TemplateReplace(template, data)
|
||||||
|
|
||||||
|
fmt.Println(result)
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// Hello, my name is Bob, I'm 20 years old.
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="RegexMatchAllGroups">RegexMatchAllGroups</span>
|
||||||
|
|
||||||
|
<p>使用正则表达式匹配字符串中的所有子组并返回结果。</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func RegexMatchAllGroups(pattern, str string) [][]string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>示例:<span style="float:right;display:inline-block;">[Run]()</span></b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
pattern := `(\w+\.+\w+)@(\w+)\.(\w+)`
|
||||||
|
str := "Emails: john.doe@example.com and jane.doe@example.com"
|
||||||
|
|
||||||
|
result := strutil.RegexMatchAllGroups(pattern, str)
|
||||||
|
|
||||||
|
fmt.Println(result[0])
|
||||||
|
fmt.Println(result[1])
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// [john.doe@example.com john.doe example com]
|
||||||
|
// [jane.doe@example.com jane.doe example com]
|
||||||
|
}
|
||||||
|
```
|
||||||
@@ -66,6 +66,8 @@ import (
|
|||||||
- [Ellipsis](#Ellipsis)
|
- [Ellipsis](#Ellipsis)
|
||||||
- [Shuffle](#Shuffle)
|
- [Shuffle](#Shuffle)
|
||||||
- [Rotate](#Rotate)
|
- [Rotate](#Rotate)
|
||||||
|
- [TemplateReplace](#TemplateReplace)
|
||||||
|
- [RegexMatchAllGroups](#RegexMatchAllGroups)
|
||||||
|
|
||||||
<div STYLE="page-break-after: always;"></div>
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
@@ -1660,3 +1662,70 @@ func main() {
|
|||||||
// oHell
|
// oHell
|
||||||
// loHel
|
// loHel
|
||||||
}
|
}
|
||||||
|
```
|
||||||
|
### <span id="TemplateReplace">TemplateReplace</span>
|
||||||
|
|
||||||
|
<p>Replaces the placeholders in the template string with the corresponding values in the data map.The placeholders are enclosed in curly braces, e.g. {key}. for example, the template string is "Hello, {name}!", and the data map is {"name": "world"}, the result will be "Hello, world!".</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func TemplateReplace(template string, data map[string]string string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>example:<span style="float:right;display:inline-block;">[Run]()</span></b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
template := `Hello, my name is {name}, I'm {age} years old.`
|
||||||
|
data := map[string]string{
|
||||||
|
"name": "Bob",
|
||||||
|
"age": "20",
|
||||||
|
}
|
||||||
|
|
||||||
|
result := strutil.TemplateReplace(template, data)
|
||||||
|
|
||||||
|
fmt.Println(result)
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// Hello, my name is Bob, I'm 20 years old.
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="RegexMatchAllGroups">RegexMatchAllGroups</span>
|
||||||
|
|
||||||
|
<p>Matches all subgroups in a string using a regular expression and returns the result.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func RegexMatchAllGroups(pattern, str string) [][]string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>example:<span style="float:right;display:inline-block;">[Run]()</span></b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
pattern := `(\w+\.+\w+)@(\w+)\.(\w+)`
|
||||||
|
str := "Emails: john.doe@example.com and jane.doe@example.com"
|
||||||
|
|
||||||
|
result := strutil.RegexMatchAllGroups(pattern, str)
|
||||||
|
|
||||||
|
fmt.Println(result[0])
|
||||||
|
fmt.Println(result[1])
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// [john.doe@example.com john.doe example com]
|
||||||
|
// [jane.doe@example.com jane.doe example com]
|
||||||
|
}
|
||||||
|
```
|
||||||
@@ -704,3 +704,34 @@ func Rotate(str string, shift int) string {
|
|||||||
|
|
||||||
return sb.String()
|
return sb.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TemplateReplace replaces the placeholders in the template string with the corresponding values in the data map.
|
||||||
|
// The placeholders are enclosed in curly braces, e.g. {key}.
|
||||||
|
// for example, the template string is "Hello, {name}!", and the data map is {"name": "world"},
|
||||||
|
// the result will be "Hello, world!".
|
||||||
|
// Play: todo
|
||||||
|
func TemplateReplace(template string, data map[string]string) string {
|
||||||
|
re := regexp.MustCompile(`\{(\w+)\}`)
|
||||||
|
|
||||||
|
result := re.ReplaceAllStringFunc(template, func(s string) string {
|
||||||
|
key := strings.Trim(s, "{}")
|
||||||
|
if val, ok := data[key]; ok {
|
||||||
|
return val
|
||||||
|
}
|
||||||
|
|
||||||
|
return s
|
||||||
|
})
|
||||||
|
|
||||||
|
result = strings.ReplaceAll(result, "{{", "{")
|
||||||
|
result = strings.ReplaceAll(result, "}}", "}")
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// RegexMatchAllGroups Matches all subgroups in a string using a regular expression and returns the result.
|
||||||
|
// Play: todo
|
||||||
|
func RegexMatchAllGroups(pattern, str string) [][]string {
|
||||||
|
re := regexp.MustCompile(pattern)
|
||||||
|
matches := re.FindAllStringSubmatch(str, -1)
|
||||||
|
return matches
|
||||||
|
}
|
||||||
|
|||||||
@@ -724,3 +724,32 @@ func ExampleRotate() {
|
|||||||
// oHell
|
// oHell
|
||||||
// loHel
|
// loHel
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ExampleTemplateReplace() {
|
||||||
|
template := `Hello, my name is {name}, I'm {age} years old.`
|
||||||
|
data := map[string]string{
|
||||||
|
"name": "Bob",
|
||||||
|
"age": "20",
|
||||||
|
}
|
||||||
|
|
||||||
|
result := TemplateReplace(template, data)
|
||||||
|
|
||||||
|
fmt.Println(result)
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// Hello, my name is Bob, I'm 20 years old.
|
||||||
|
}
|
||||||
|
|
||||||
|
func ExampleRegexMatchAllGroups() {
|
||||||
|
pattern := `(\w+\.+\w+)@(\w+)\.(\w+)`
|
||||||
|
str := "Emails: john.doe@example.com and jane.doe@example.com"
|
||||||
|
|
||||||
|
result := RegexMatchAllGroups(pattern, str)
|
||||||
|
|
||||||
|
fmt.Println(result[0])
|
||||||
|
fmt.Println(result[1])
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// [john.doe@example.com john.doe example com]
|
||||||
|
// [jane.doe@example.com jane.doe example com]
|
||||||
|
}
|
||||||
|
|||||||
@@ -766,3 +766,90 @@ func TestRotate(t *testing.T) {
|
|||||||
assert.Equal(tt.expected, Rotate(tt.input, tt.shift))
|
assert.Equal(tt.expected, Rotate(tt.input, tt.shift))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestTemplateReplace(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
assert := internal.NewAssert(t, "TestTemplateReplace")
|
||||||
|
|
||||||
|
t.Run("basic", func(t *testing.T) {
|
||||||
|
template := `Hello, my name is {name}, I'm {age} years old.`
|
||||||
|
data := map[string]string{
|
||||||
|
"name": "Bob",
|
||||||
|
"age": "20",
|
||||||
|
}
|
||||||
|
|
||||||
|
expected := `Hello, my name is Bob, I'm 20 years old.`
|
||||||
|
result := TemplateReplace(template, data)
|
||||||
|
|
||||||
|
assert.Equal(expected, result)
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("not found", func(t *testing.T) {
|
||||||
|
template := `Hello, my name is {name}, I'm {age} years old.`
|
||||||
|
data := map[string]string{
|
||||||
|
"name": "Bob",
|
||||||
|
}
|
||||||
|
|
||||||
|
expected := `Hello, my name is Bob, I'm {age} years old.`
|
||||||
|
result := TemplateReplace(template, data)
|
||||||
|
|
||||||
|
assert.Equal(expected, result)
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("brackets", func(t *testing.T) {
|
||||||
|
template := `Hello, my name is {name}, I'm {{age}} years old.`
|
||||||
|
data := map[string]string{
|
||||||
|
"name": "Bob",
|
||||||
|
"age": "20",
|
||||||
|
}
|
||||||
|
|
||||||
|
expected := `Hello, my name is Bob, I'm {20} years old.`
|
||||||
|
result := TemplateReplace(template, data)
|
||||||
|
|
||||||
|
assert.Equal(expected, result)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestRegexMatchAllGroups(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
assert := internal.NewAssert(t, "TestRegexMatchAllGroups")
|
||||||
|
|
||||||
|
tests := []struct {
|
||||||
|
pattern string
|
||||||
|
str string
|
||||||
|
expected [][]string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
pattern: `(\w+\.+\w+)@(\w+)\.(\w+)`,
|
||||||
|
str: "Emails: john.doe@example.com and jane.doe@example.com",
|
||||||
|
expected: [][]string{{"john.doe@example.com", "john.doe", "example", "com"}, {"jane.doe@example.com", "jane.doe", "example", "com"}},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pattern: `(\d+)`,
|
||||||
|
str: "No numbers here!",
|
||||||
|
expected: nil,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pattern: `(\d{3})-(\d{2})-(\d{4})`,
|
||||||
|
str: "My number is 123-45-6789",
|
||||||
|
expected: [][]string{{"123-45-6789", "123", "45", "6789"}},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pattern: `(\w+)\s(\d+)`,
|
||||||
|
str: "Item A 123, Item B 456",
|
||||||
|
expected: [][]string{{"A 123", "A", "123"}, {"B 456", "B", "456"}},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pattern: `(\d{2})-(\d{2})-(\d{4})`,
|
||||||
|
str: "Dates: 01-01-2020, 12-31-1999",
|
||||||
|
expected: [][]string{{"01-01-2020", "01", "01", "2020"}, {"12-31-1999", "12", "31", "1999"}},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range tests {
|
||||||
|
result := RegexMatchAllGroups(tt.pattern, tt.str)
|
||||||
|
assert.Equal(tt.expected, result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user