mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
string.split_nth - return the rest of the string as the last value in the result array
This commit is contained in:
parent
df2d3a268d
commit
219239eadc
@ -402,6 +402,12 @@ pub fn (s string) split(delim string) []string {
|
|||||||
return s.split_nth(delim, 0)
|
return s.split_nth(delim, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
split_nth - splits the string based on the passed `delim` substring.
|
||||||
|
It returns the first Nth parts. When N=0, return all the splits.
|
||||||
|
The last returned element has the remainder of the string, even if
|
||||||
|
the remainder contains more `delim` substrings.
|
||||||
|
*/
|
||||||
pub fn (s string) split_nth(delim string, nth int) []string {
|
pub fn (s string) split_nth(delim string, nth int) []string {
|
||||||
mut res := []string
|
mut res := []string
|
||||||
mut i := 0
|
mut i := 0
|
||||||
@ -418,6 +424,7 @@ pub fn (s string) split_nth(delim string, nth int) []string {
|
|||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
mut start := 0
|
mut start := 0
|
||||||
|
nth_1 := nth - 1
|
||||||
for i <= s.len {
|
for i <= s.len {
|
||||||
mut is_delim := s[i] == delim[0]
|
mut is_delim := s[i] == delim[0]
|
||||||
mut j := 0
|
mut j := 0
|
||||||
@ -425,10 +432,6 @@ pub fn (s string) split_nth(delim string, nth int) []string {
|
|||||||
is_delim = is_delim && s[i + j] == delim[j]
|
is_delim = is_delim && 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 is_delim || last {
|
if is_delim || last {
|
||||||
if !is_delim && last {
|
if !is_delim && last {
|
||||||
@ -438,6 +441,13 @@ pub fn (s string) split_nth(delim string, nth int) []string {
|
|||||||
if val.starts_with(delim) {
|
if val.starts_with(delim) {
|
||||||
val = val.right(delim.len)
|
val = val.right(delim.len)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
was_last := nth > 0 && res.len == nth_1
|
||||||
|
if was_last {
|
||||||
|
res << s.right(start)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
res << val
|
res << val
|
||||||
start = i + delim.len
|
start = i + delim.len
|
||||||
}
|
}
|
||||||
|
@ -121,6 +121,32 @@ fn test_split_nth() {
|
|||||||
assert (e.split_nth(',', 3).len == 3)
|
assert (e.split_nth(',', 3).len == 3)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn test_split_nth_values() {
|
||||||
|
line := 'CMD=eprintln(phase=1)'
|
||||||
|
|
||||||
|
a0 := line.split_nth('=', 0)
|
||||||
|
assert a0.len == 3
|
||||||
|
assert a0[0] == 'CMD'
|
||||||
|
assert a0[1] == 'eprintln(phase'
|
||||||
|
assert a0[2] == '1)'
|
||||||
|
|
||||||
|
a1 := line.split_nth('=', 1)
|
||||||
|
assert a1.len == 1
|
||||||
|
assert a1[0] == 'CMD=eprintln(phase=1)'
|
||||||
|
|
||||||
|
a2 := line.split_nth('=', 2)
|
||||||
|
assert a2.len == 2
|
||||||
|
assert a2[0] == 'CMD'
|
||||||
|
assert a2[1] == 'eprintln(phase=1)'
|
||||||
|
|
||||||
|
a3 := line.split_nth('=', 3)
|
||||||
|
assert a3.len == 3
|
||||||
|
assert a3[0] == 'CMD'
|
||||||
|
assert a3[1] == 'eprintln(phase'
|
||||||
|
assert a3[2] == '1)'
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
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(':')
|
||||||
|
Loading…
Reference in New Issue
Block a user