strings: split_nth and add tests
parent
ec15bfb7d1
commit
5ff387bbe4
|
@ -63,10 +63,6 @@ pub fn (s string) split(delim string) []string {
|
||||||
return s.split(delim)
|
return s.split(delim)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn (s string) split_single(delim byte) []string {
|
|
||||||
return s.split(delim.str())
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn (s string) split_into_lines() []string {
|
pub fn (s string) split_into_lines() []string {
|
||||||
return s.split('\n')
|
return s.split('\n')
|
||||||
}
|
}
|
||||||
|
|
|
@ -285,76 +285,50 @@ fn (s string) add(a string) string {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn (s string) split(delim string) []string {
|
pub fn (s string) split(delim string) []string {
|
||||||
// println('string split delim="$delim" s="$s"')
|
return s.split_nth(delim, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn (s string) split_nth(delim string, nth int) []string {
|
||||||
mut res := []string
|
mut res := []string
|
||||||
// if delim.len == 0 {
|
mut i := 0
|
||||||
// res << s
|
|
||||||
// return res
|
|
||||||
// }
|
|
||||||
if delim.len == 0 {
|
if delim.len == 0 {
|
||||||
|
i = 1
|
||||||
for ch in s {
|
for ch in s {
|
||||||
|
if nth > 0 && i >= nth {
|
||||||
|
res << s.substr(i, s.len)
|
||||||
|
break
|
||||||
|
}
|
||||||
res << ch.str()
|
res << ch.str()
|
||||||
|
i++
|
||||||
}
|
}
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
if delim.len == 1 {
|
mut start := 0
|
||||||
return s.split_single(delim[0])
|
for i <= s.len {
|
||||||
}
|
mut is_delim := s[i] == delim[0]
|
||||||
mut i := 0
|
mut j := 0
|
||||||
mut start := 0// - 1
|
for is_delim && j < delim.len {
|
||||||
for i < s.len {
|
is_delim = is_delim && s[i + j] == delim[j]
|
||||||
// printiln(i)
|
|
||||||
mut a := s[i] == delim[0]
|
|
||||||
mut j := 1
|
|
||||||
for j < delim.len && a {
|
|
||||||
a = a && s[i + j] == delim[j]
|
|
||||||
j++
|
j++
|
||||||
}
|
}
|
||||||
|
was_last := nth > 0 && res.len == nth
|
||||||
|
if was_last{break}
|
||||||
last := i == s.len - 1
|
last := i == s.len - 1
|
||||||
if a || last {
|
if is_delim || last {
|
||||||
if last {
|
if !is_delim && last {
|
||||||
i++
|
i++
|
||||||
}
|
}
|
||||||
mut val := s.substr(start, i)
|
mut val := s.substr(start, i)
|
||||||
// println('got it "$val" start=$start i=$i delim="$delim"')
|
if val.starts_with(delim) {
|
||||||
if val.len > 0 {
|
val = val.right(delim.len)
|
||||||
// todo perf
|
|
||||||
// val now is '___VAL'. remove '___' from the start
|
|
||||||
if val.starts_with(delim) {
|
|
||||||
// println('!!')
|
|
||||||
val = val.right(delim.len)
|
|
||||||
}
|
|
||||||
res << val.trim_space()
|
|
||||||
}
|
}
|
||||||
start = i
|
res << val
|
||||||
|
start = i + delim.len
|
||||||
}
|
}
|
||||||
i++
|
i++
|
||||||
}
|
}
|
||||||
return res
|
if s.ends_with (delim) && (nth < 1 || res.len < nth) {
|
||||||
}
|
res << ''
|
||||||
|
|
||||||
pub fn (s string) split_single(delim byte) []string {
|
|
||||||
mut res := []string
|
|
||||||
if int(delim) == 0 {
|
|
||||||
res << s
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
mut i := 0
|
|
||||||
mut start := 0
|
|
||||||
for i < s.len {
|
|
||||||
is_delim := s[i] == delim
|
|
||||||
last := i == s.len - 1
|
|
||||||
if is_delim || last {
|
|
||||||
if !is_delim && i == s.len - 1 {
|
|
||||||
i++
|
|
||||||
}
|
|
||||||
val := s.substr(start, i)
|
|
||||||
if val.len > 0 {
|
|
||||||
res << val
|
|
||||||
}
|
|
||||||
start = i + 1
|
|
||||||
}
|
|
||||||
i++
|
|
||||||
}
|
}
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
|
@ -87,6 +87,37 @@ fn test_sort() {
|
||||||
assert vals[3] == 'arr'
|
assert vals[3] == 'arr'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn test_split_nth() {
|
||||||
|
a := "1,2,3"
|
||||||
|
assert (a.split(',').len == 3)
|
||||||
|
assert (a.split_nth(',', -1).len == 3)
|
||||||
|
assert (a.split_nth(',', 0).len == 3)
|
||||||
|
assert (a.split_nth(',', 1).len == 1)
|
||||||
|
assert (a.split_nth(',', 2).len == 2)
|
||||||
|
assert (a.split_nth(',', 10).len == 3)
|
||||||
|
b := "1::2::3"
|
||||||
|
assert (b.split('::').len == 3)
|
||||||
|
assert (b.split_nth('::', -1).len == 3)
|
||||||
|
assert (b.split_nth('::', 0).len == 3)
|
||||||
|
assert (b.split_nth('::', 1).len == 1)
|
||||||
|
assert (b.split_nth('::', 2).len == 2)
|
||||||
|
assert (b.split_nth('::', 10).len == 3)
|
||||||
|
c := "ABCDEF"
|
||||||
|
assert (c.split('').len == 6)
|
||||||
|
assert (c.split_nth('', 3).len == 3)
|
||||||
|
assert (c.split_nth('BC', -1).len == 2)
|
||||||
|
d := ","
|
||||||
|
assert (d.split(',').len == 2)
|
||||||
|
assert (d.split_nth('', 3).len == 1)
|
||||||
|
assert (d.split_nth(',', -1).len == 2)
|
||||||
|
assert (d.split_nth(',', 3).len == 2)
|
||||||
|
e := ",,,0,,,,,a,,b,"
|
||||||
|
// assert (e.split(',,').len == 5)
|
||||||
|
// assert (e.split_nth(',,', 3).len == 2)
|
||||||
|
assert (e.split_nth(',', -1).len == 12)
|
||||||
|
assert (e.split_nth(',', 3).len == 3)
|
||||||
|
}
|
||||||
|
|
||||||
fn test_split() {
|
fn test_split() {
|
||||||
mut s := 'volt/twitch.v:34'
|
mut s := 'volt/twitch.v:34'
|
||||||
mut vals := s.split(':')
|
mut vals := s.split(':')
|
||||||
|
@ -109,10 +140,11 @@ fn test_split() {
|
||||||
// /////////
|
// /////////
|
||||||
s = 'lalala'
|
s = 'lalala'
|
||||||
vals = s.split('a')
|
vals = s.split('a')
|
||||||
assert vals.len == 3
|
assert vals.len == 4
|
||||||
assert vals[0] == 'l'
|
assert vals[0] == 'l'
|
||||||
assert vals[1] == 'l'
|
assert vals[1] == 'l'
|
||||||
assert vals[2] == 'l'
|
assert vals[2] == 'l'
|
||||||
|
assert vals[3] == ''
|
||||||
// /////////
|
// /////////
|
||||||
s = 'awesome'
|
s = 'awesome'
|
||||||
a := s.split('')
|
a := s.split('')
|
||||||
|
|
Loading…
Reference in New Issue