regex: add a replace_n function (#13016)
parent
4d4398fa8a
commit
1ad4fbd841
|
@ -604,6 +604,16 @@ to use a quick function:
|
||||||
pub fn (mut re RE) replace_simple(in_txt string, repl string) string
|
pub fn (mut re RE) replace_simple(in_txt string, repl string) string
|
||||||
```
|
```
|
||||||
|
|
||||||
|
If it is needed to replace N instances of the found strings it is possible to use:
|
||||||
|
```v ignore
|
||||||
|
// replace_n return a string where the firts `count` matches are replaced with the repl_str string
|
||||||
|
// `count` indicate the number of max replacements that will be done.
|
||||||
|
// if count is > 0 the replace began from the start of the string toward the end
|
||||||
|
// if count is < 0 the replace began from the end of the string toward the start
|
||||||
|
// if count is 0 do nothing
|
||||||
|
pub fn (mut re RE) replace_n(in_txt string, repl_str string, count int) string
|
||||||
|
```
|
||||||
|
|
||||||
#### Custom replace function
|
#### Custom replace function
|
||||||
|
|
||||||
For complex find and replace operations, you can use `replace_by_fn` .
|
For complex find and replace operations, you can use `replace_by_fn` .
|
||||||
|
|
|
@ -623,6 +623,25 @@ fn test_regex_func_replace(){
|
||||||
assert result == txt2
|
assert result == txt2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn rest_regex_replace_n(){
|
||||||
|
s := "dario 1234 pepep 23454 pera"
|
||||||
|
query := r"\d+"
|
||||||
|
|
||||||
|
mut re := regex.regex_opt(query) or { panic(err) }
|
||||||
|
|
||||||
|
assert re.replace_n(s, "[repl]", 0) == "dario 1234 pepep 23454 pera"
|
||||||
|
assert re.replace_n(s, "[repl]", -1) == "dario 1234 pepep [repl] pera"
|
||||||
|
assert re.replace_n(s, "[repl]", 1) == "dario [repl] pepep 23454 pera"
|
||||||
|
assert re.replace_n(s, "[repl]", 2) == "dario [repl] pepep [repl] pera"
|
||||||
|
assert re.replace_n(s, "[repl]", -2) == "dario [repl] pepep [repl] pera"
|
||||||
|
assert re.replace_n(s, "[repl]", 3) == "dario [repl] pepep [repl] pera"
|
||||||
|
assert re.replace_n(s, "[repl]", -3) == "dario [repl] pepep [repl] pera"
|
||||||
|
|
||||||
|
//mut res := re.replace_n(s, "[repl]", -1)
|
||||||
|
//println("source: ${s}")
|
||||||
|
//println("res : ${res}")
|
||||||
|
}
|
||||||
|
|
||||||
// test quantifier wrong sequences
|
// test quantifier wrong sequences
|
||||||
const(
|
const(
|
||||||
test_quantifier_sequences_list = [
|
test_quantifier_sequences_list = [
|
||||||
|
|
|
@ -463,3 +463,37 @@ pub fn (mut re RE) replace(in_txt string, repl_str string) string {
|
||||||
}
|
}
|
||||||
return res.str()
|
return res.str()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// replace_n return a string where the firts count matches are replaced with the repl_str string,
|
||||||
|
// if count is > 0 the replace began from the start of the string toward the end
|
||||||
|
// if count is < 0 the replace began from the end of the string toward the start
|
||||||
|
// if count is 0 do nothing
|
||||||
|
pub fn (mut re RE) replace_n(in_txt string, repl_str string, count int) string {
|
||||||
|
mut i := 0
|
||||||
|
mut index := 0
|
||||||
|
mut i_p := 0
|
||||||
|
mut res := strings.new_builder(in_txt.len)
|
||||||
|
mut lst := re.find_all(in_txt)
|
||||||
|
|
||||||
|
if count < 0 { // start from the right of the string
|
||||||
|
lst = lst#[count * 2..] // limitate the number of substitions
|
||||||
|
} else if count > 0 { // start from the left of the string
|
||||||
|
lst = lst#[..count * 2] // limitate the number of substitions
|
||||||
|
} else if count == 0 { // no replace
|
||||||
|
return in_txt
|
||||||
|
}
|
||||||
|
|
||||||
|
// println("found: ${lst}")
|
||||||
|
for index < lst.len {
|
||||||
|
i = lst[index]
|
||||||
|
res.write_string(in_txt[i_p..i])
|
||||||
|
res.write_string(repl_str)
|
||||||
|
index++
|
||||||
|
i_p = lst[index]
|
||||||
|
index++
|
||||||
|
}
|
||||||
|
i = i_p
|
||||||
|
res.write_string(in_txt[i..])
|
||||||
|
|
||||||
|
return res.str()
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue