mirror of
https://gitee.com/johng/gf.git
synced 2024-11-29 18:57:44 +08:00
141 lines
3.6 KiB
Go
141 lines
3.6 KiB
Go
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
|
//
|
|
// This Source Code Form is subject to the terms of the MIT License.
|
|
// If a copy of the MIT was not distributed with this file,
|
|
// You can obtain one at https://github.com/gogf/gf.
|
|
|
|
package gstr
|
|
|
|
import "strings"
|
|
|
|
// Pos returns the position of the first occurrence of `needle`
|
|
// in `haystack` from `startOffset`, case-sensitively.
|
|
// It returns -1, if not found.
|
|
func Pos(haystack, needle string, startOffset ...int) int {
|
|
length := len(haystack)
|
|
offset := 0
|
|
if len(startOffset) > 0 {
|
|
offset = startOffset[0]
|
|
}
|
|
if length == 0 || offset > length || -offset > length {
|
|
return -1
|
|
}
|
|
if offset < 0 {
|
|
offset += length
|
|
}
|
|
pos := strings.Index(haystack[offset:], needle)
|
|
if pos == NotFoundIndex {
|
|
return NotFoundIndex
|
|
}
|
|
return pos + offset
|
|
}
|
|
|
|
// PosRune acts like function Pos but considers `haystack` and `needle` as unicode string.
|
|
func PosRune(haystack, needle string, startOffset ...int) int {
|
|
pos := Pos(haystack, needle, startOffset...)
|
|
if pos < 3 {
|
|
return pos
|
|
}
|
|
return len([]rune(haystack[:pos]))
|
|
}
|
|
|
|
// PosI returns the position of the first occurrence of `needle`
|
|
// in `haystack` from `startOffset`, case-insensitively.
|
|
// It returns -1, if not found.
|
|
func PosI(haystack, needle string, startOffset ...int) int {
|
|
length := len(haystack)
|
|
offset := 0
|
|
if len(startOffset) > 0 {
|
|
offset = startOffset[0]
|
|
}
|
|
if length == 0 || offset > length || -offset > length {
|
|
return -1
|
|
}
|
|
|
|
if offset < 0 {
|
|
offset += length
|
|
}
|
|
pos := strings.Index(strings.ToLower(haystack[offset:]), strings.ToLower(needle))
|
|
if pos == -1 {
|
|
return -1
|
|
}
|
|
return pos + offset
|
|
}
|
|
|
|
// PosIRune acts like function PosI but considers `haystack` and `needle` as unicode string.
|
|
func PosIRune(haystack, needle string, startOffset ...int) int {
|
|
pos := PosI(haystack, needle, startOffset...)
|
|
if pos < 3 {
|
|
return pos
|
|
}
|
|
return len([]rune(haystack[:pos]))
|
|
}
|
|
|
|
// PosR returns the position of the last occurrence of `needle`
|
|
// in `haystack` from `startOffset`, case-sensitively.
|
|
// It returns -1, if not found.
|
|
func PosR(haystack, needle string, startOffset ...int) int {
|
|
offset := 0
|
|
if len(startOffset) > 0 {
|
|
offset = startOffset[0]
|
|
}
|
|
pos, length := 0, len(haystack)
|
|
if length == 0 || offset > length || -offset > length {
|
|
return -1
|
|
}
|
|
|
|
if offset < 0 {
|
|
haystack = haystack[:offset+length+1]
|
|
} else {
|
|
haystack = haystack[offset:]
|
|
}
|
|
pos = strings.LastIndex(haystack, needle)
|
|
if offset > 0 && pos != -1 {
|
|
pos += offset
|
|
}
|
|
return pos
|
|
}
|
|
|
|
// PosRRune acts like function PosR but considers `haystack` and `needle` as unicode string.
|
|
func PosRRune(haystack, needle string, startOffset ...int) int {
|
|
pos := PosR(haystack, needle, startOffset...)
|
|
if pos < 3 {
|
|
return pos
|
|
}
|
|
return len([]rune(haystack[:pos]))
|
|
}
|
|
|
|
// PosRI returns the position of the last occurrence of `needle`
|
|
// in `haystack` from `startOffset`, case-insensitively.
|
|
// It returns -1, if not found.
|
|
func PosRI(haystack, needle string, startOffset ...int) int {
|
|
offset := 0
|
|
if len(startOffset) > 0 {
|
|
offset = startOffset[0]
|
|
}
|
|
pos, length := 0, len(haystack)
|
|
if length == 0 || offset > length || -offset > length {
|
|
return -1
|
|
}
|
|
|
|
if offset < 0 {
|
|
haystack = haystack[:offset+length+1]
|
|
} else {
|
|
haystack = haystack[offset:]
|
|
}
|
|
pos = strings.LastIndex(strings.ToLower(haystack), strings.ToLower(needle))
|
|
if offset > 0 && pos != -1 {
|
|
pos += offset
|
|
}
|
|
return pos
|
|
}
|
|
|
|
// PosRIRune acts like function PosRI but considers `haystack` and `needle` as unicode string.
|
|
func PosRIRune(haystack, needle string, startOffset ...int) int {
|
|
pos := PosRI(haystack, needle, startOffset...)
|
|
if pos < 3 {
|
|
return pos
|
|
}
|
|
return len([]rune(haystack[:pos]))
|
|
}
|