-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstr.go
501 lines (428 loc) · 11.5 KB
/
str.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
package rose
import (
"fmt"
"math/rand"
"strconv"
"strings"
"unicode"
)
// StrIsEmpty Check if a string is empty
func StrIsEmpty(s string) bool {
return len(strings.TrimSpace(s)) == 0
}
// StrTrim TrimSpace
func StrTrim(s string) string {
return strings.TrimSpace(s)
}
// StrTrimL TrimPrefix
func StrTrimL(s, left string) string {
return strings.TrimPrefix(s, left)
}
// StrTrimR TrimSuffix
func StrTrimR(s, right string) string {
return strings.TrimSuffix(s, right)
}
// StrToInt 将数字字符串转换成数字类型
func StrToInt(s string) int {
if s == "" {
return 0
}
if i, err := strconv.Atoi(s); err != nil {
return 0
} else {
return i
}
}
// StrToIntDef 将数字字符串转换为数值类型,转换失败使用默认值
func StrToIntDef(s string, def int) int {
if s == "" {
return def
}
if i, err := strconv.Atoi(s); err != nil {
return def
} else {
return i
}
}
// StrToIntErr 将数字字符串转换为数值类型,转换失败抛出异常
func StrToIntErr(s string) (int, error) {
return strconv.Atoi(s)
}
// StrToInt64 将字符串转换为int64(转换失败返回0
func StrToInt64(s string) int64 {
if s == "" {
return 0
}
if i, err := strconv.ParseInt(s, 10, 64); err != nil {
return 0
} else {
return i
}
}
// StrToInt64Def 转换失败返回预设值
func StrToInt64Def(s string, def int64) int64 {
if s == "" {
return def
}
if i, err := strconv.ParseInt(s, 10, 64); err != nil {
return def
} else {
return i
}
}
// StrToInt64Err 将字符串转换为int64
func StrToInt64Err(s string) (int64, error) {
return strconv.ParseInt(s, 10, 64)
}
// StrToFloat64 将数字字符串转换成float64类型(转换失败返回0.0
func StrToFloat64(s string) float64 {
if s == "" {
return 0.0
}
if i, err := strconv.ParseFloat(s, 64); err != nil {
return 0.0
} else {
return i
}
}
// StrToFloat64Def 将数字字符串转换成float64类型
func StrToFloat64Def(s string, def float64) float64 {
if s == "" {
return def
}
if i, err := strconv.ParseFloat(s, 64); err != nil {
return def
} else {
return i
}
}
// StrToFloat64Err 将数字字符串转换成float64类型
func StrToFloat64Err(s string) (float64, error) {
return strconv.ParseFloat(s, 64)
}
func StrToBool(s string) bool {
if b, err := strconv.ParseBool(s); err != nil {
return false
} else {
return b
}
}
// StrToBoolDef 转换失败返回预设值
func StrToBoolDef(s string, def bool) bool {
if b, err := strconv.ParseBool(s); err != nil {
return def
} else {
return b
}
}
func StrToBoolErr(s string) (bool, error) {
return strconv.ParseBool(s)
}
// StrToChar convert string to char slice
func StrToChar(s string) []string {
c := make([]string, 0)
if len(s) == 0 {
c = append(c, "")
}
for _, v := range s {
c = append(c, string(v))
}
return c
}
// -----------------
// StrAnySplit 对字符串使用任意一个或多个字符分隔,**同时排除空字符**
func StrAnySplit(s string, seps ...string) []string {
if len(s) == 0 {
return make([]string, 0)
}
sep := SliceStrToStr(seps, "")
splitter := func(r rune) bool {
return strings.ContainsRune(sep, r)
}
return strings.FieldsFunc(s, splitter)
}
// StrAnySplitFirst 获取分隔后数组第一项
func StrAnySplitFirst(s string, seps ...string) string {
strs := StrAnySplit(s, seps...)
if len(strs) > 0 {
return strs[0]
}
return ""
}
// StrAnySplitLast 获取分隔后数组最后一项
func StrAnySplitLast(s string, seps ...string) string {
strs := StrAnySplit(s, seps...)
if len(strs) > 0 {
return strs[len(strs)-1]
}
return ""
}
// StrAnySplitIndex 获取分隔后数组的指定索引项
func StrAnySplitIndex(s string, index int, seps ...string) string {
strs := StrAnySplit(s, seps...)
for i, val := range strs {
if i == index {
return val
}
}
return ""
}
// StrAnyTrim 移除字符串首部以及尾部的任意指定字符
func StrAnyTrim(s string, seps ...string) string {
// 先对分隔字符串按照长度由大到小排序
seps = SliceSortByLength(seps, false)
for _, sep := range seps {
s = strings.Trim(s, sep)
}
return s
}
// StrAnyRemove 移除字符串中包含的任意指定字符
func StrAnyRemove(s string, seps ...string) string {
// 先对分隔字符串按照长度由大到小排序
seps = SliceSortByLength(seps, false)
for _, sep := range seps {
if strings.Contains(s, sep) {
s = strings.ReplaceAll(s, sep, "")
}
}
return s
}
// StrAnyReplace 将字符串中包含的任意指定字符串替换为新的字符串
func StrAnyReplace(s string, new string, seps ...string) string {
// 先对分隔字符串按照长度由大到小排序
seps = SliceSortByLength(seps, false)
for _, sep := range seps {
if strings.Contains(s, sep) {
s = strings.ReplaceAll(s, sep, new)
}
}
return s
}
// StrAnyContains 判断字符串中是否包含指定的任意字符串
func StrAnyContains(s string, seps ...string) bool {
for _, sep := range seps {
if strings.Contains(s, sep) {
return true
}
}
return false
}
// StrAnyPrefix 是否以任何前缀字符串开头,区分大小写
func StrAnyPrefix(s string, prefixes ...string) bool {
for _, prefix := range prefixes {
if strings.HasPrefix(s, prefix) {
return true
}
}
return false
}
// StrAnySuffix 是否以任何后缀字符串结尾,区分大小写
func StrAnySuffix(s string, suffixes ...string) bool {
for _, suffix := range suffixes {
if strings.HasSuffix(s, suffix) {
return true
}
}
return false
}
// StrAnyPrefixI 是否以任何前缀字符串开头,不区分大小写
func StrAnyPrefixI(s string, prefixes ...string) bool {
st := strings.ToLower(s)
for _, prefix := range prefixes {
if strings.HasPrefix(st, strings.ToLower(prefix)) {
return true
}
}
return false
}
// StrAnySuffixI 是否以任何后缀字符串结尾,不区分大小写
func StrAnySuffixI(s string, suffixes ...string) bool {
st := strings.ToLower(s)
for _, suffix := range suffixes {
if strings.HasSuffix(st, strings.ToLower(suffix)) {
return true
}
}
return false
}
// StrSpecialTrim 清除特定字符(如换行符、回车符、制表符、空格等),无论在前、后、还是中间
func StrSpecialTrim(s string) string {
return strings.Map(func(r rune) rune {
if r == '\n' || r == '\r' || r == '\t' || r == ' ' {
return -1 // 删除这些字符
}
return r
}, s)
}
// -------------------
// StrJoin 字符串拼接
func StrJoin(args ...string) string {
var buffer strings.Builder
for _, arg := range args {
buffer.WriteString(arg)
}
return buffer.String()
}
// StrJoinWith alias strings.Join()
func StrJoinWith(elems []string, sep string) string {
return strings.Join(elems, sep)
}
// StrEqualFold 比较两个字符串内容是否相同,忽略大小写差异
func StrEqualFold(s, t string) bool {
return strings.EqualFold(s, t)
}
// StrEqualFull 比较两个字符串是否完全相同,大小写敏感
func StrEqualFull(s, t string) bool {
return s == t
}
// StrToLower 将字符串转换为小写形式
func StrToLower(s string) string {
return strings.ToLower(s)
}
// StrToUpper 将字符串转换为大写形式
func StrToUpper(s string) string {
return strings.ToUpper(s)
}
// StrSizeSplit 按照指定长度大小拆分字符串
func StrSizeSplit(s string, chunkSize int) []string {
var chunks []string
for i := 0; i < len(s); i += chunkSize {
end := i + chunkSize
if end > len(s) {
end = len(s)
}
chunks = append(chunks, s[i:end])
}
return chunks
}
// -----------------
// TODO 待优化
// StrToUnderScoreName 将字符串驼峰式写法转为下划线写法
func StrToUnderScoreName(name string) string {
buffer := NewBuffer()
for i, r := range name {
if unicode.IsUpper(r) {
if i != 0 {
buffer.Append('_')
}
buffer.Append(unicode.ToLower(r))
} else {
buffer.Append(r)
}
}
return buffer.String()
}
// StrToCamelName 将字符串下划线写法转为驼峰写法
func StrToCamelName(name string) string {
name = strings.Replace(name, "_", " ", -1)
name = strings.Title(name)
return strings.Replace(name, " ", "", -1)
}
// Substring 返回截取后的字符串
// `start >=0` 从左往右,索引从0开始 ;`start <0` 从右往左,且倒数第一个字符索引为-1
func Substring(str string, start, length int) string {
// 参数检查
if length <= 0 {
return ""
}
// 将字符串转换为 rune 切片
runes := []rune(str)
strLen := len(runes)
// 如果 start 为负值,则从右往左开始算
if start < 0 {
start = strLen + start
}
// 计算起始索引
//start = max(0, min(start, strLen)) // go v1.21
start = IntMax(0, IntMin(start, strLen))
// 计算结束索引
//end := min(start+length, strLen) // go v1.21
end := IntMin(start+length, strLen)
return string(runes[start:end])
}
// StrToUniqueString 根据输入字符串,生成一个唯一的字符串,可以指定生成字符串长度
func StrToUniqueString(input string, minLength, maxLength int) string {
timestamp := TNowS()
hashedString := Sha1(fmt.Sprintf("%s%d", input, timestamp))
hashedLength := len(hashedString)
strLength := minLength + rand.Intn(maxLength-minLength+1)
if strLength > hashedLength {
strLength = hashedLength
}
return hashedString[:strLength]
}
// --------- Deprecated -------------------
// StrToIntWithDef 转换失败返回预设值
// Deprecated: Use rose.StrToIntDef instead.
func StrToIntWithDef(s string, def int) int {
return StrToIntDef(s, def)
}
// Deprecated: Use rose.StrTrimL instead.
func StrLTrim(s, left string) string {
return StrTrimL(s, left)
}
// Deprecated: Use rose.StrTrimR instead.
func StrRTrim(s, right string) string {
return StrTrimR(s, right)
}
// StrToIntWithErr 将数字字符串转换成数字类型
// Deprecated: Use rose.StrToIntErr instead.
func StrToIntWithErr(s string) (int, error) {
return StrToIntErr(s)
}
// Deprecated: Use rose.StrToInt64Def instead.
func StrToInt64WithDef(s string, def int64) int64 {
return StrToInt64Def(s, def)
}
// Deprecated: Use rose.StrToInt64Err instead.
func StrToInt64WithErr(s string) (int64, error) {
return StrToInt64Err(s)
}
// Deprecated: Use rose.StrToFloat64Def instead.
func StrToFloat64WithDef(s string, def float64) float64 {
return StrToFloat64Def(s, def)
}
// Deprecated: Use rose.StrToFloat64Err instead.
func StrToFloat64WithErr(s string) (float64, error) {
return StrToFloat64Err(s)
}
// Deprecated: Use rose.StrToBoolDef instead.
func StrToBoolWithDef(s string, def bool) bool {
return StrToBoolDef(s, def)
}
// Deprecated: Use rose.StrToBoolErr instead.
func StrToBoolWithErr(s string) (bool, error) {
return StrToBoolErr(s)
}
// Deprecated: Use rose.StrAnySplit instead.
func StrSplitAny(s string, seps ...string) []string {
return StrAnySplit(s, seps...)
}
// Deprecated: Use rose.StrAnyTrim instead.
func StrTrimAny(s string, seps ...string) string {
return StrAnyTrim(s, seps...)
}
// Deprecated: Use rose.StrAnyRemove instead.
func StrRemoveAny(s string, seps ...string) string {
return StrAnyRemove(s, seps...)
}
// Deprecated: Use rose.StrAnyContains instead.
func StrContainsAny(s string, seps ...string) bool {
return StrAnyContains(s, seps...)
}
// Deprecated: Use rose.StrAnyPrefix instead.
func StrPrefixAny(s string, prefixes ...string) bool {
return StrAnyPrefix(s, prefixes...)
}
// Deprecated: Use rose.StrAnySuffix instead.
func StrSuffixAny(s string, suffixes ...string) bool {
return StrAnySuffix(s, suffixes...)
}
// Deprecated: Use rose.StrAnyPrefixI instead.
func StrPrefixAnyI(s string, prefixes ...string) bool {
return StrAnyPrefixI(s, prefixes...)
}
// Deprecated: Use rose.StrAnySuffixI instead.
func StrSuffixAnyI(s string, suffixes ...string) bool {
return StrAnySuffixI(s, suffixes...)
}