use {
super::regex,
std::borrow::Cow,
};
#[must_use]
pub fn remove_match<'s>(
rex: ®ex::Regex,
text: &'s str,
) -> Cow<'s, str> {
let Some(m) = rex.find(text) else {
return Cow::Borrowed(text);
};
if m.start() == 0 {
return Cow::Borrowed(&text[m.end()..]);
}
if m.end() == text.len() {
return Cow::Borrowed(&text[..m.start()]);
}
let mut s = String::with_capacity(text.len() - m.len());
s.push_str(&text[..m.start()]);
s.push_str(&text[m.end()..]);
Cow::Owned(s)
}
#[must_use]
#[cfg(not(feature = "lite"))]
pub fn bytes_remove_match<'s>(
rex: ®ex::bytes::Regex,
text: &'s [u8],
) -> Cow<'s, [u8]> {
let Some(m) = rex.find(text) else {
return Cow::Borrowed(text);
};
if m.start() == 0 {
return Cow::Borrowed(&text[m.end()..]);
}
if m.end() == text.len() {
return Cow::Borrowed(&text[..m.start()]);
}
let mut s = Vec::with_capacity(text.len() - m.len());
s.extend_from_slice(&text[..m.start()]);
s.extend_from_slice(&text[m.end()..]);
Cow::Owned(s)
}
#[must_use]
pub fn remove_all_matches<'s>(
rex: ®ex::Regex,
text: &'s str,
) -> Cow<'s, str> {
let mut trim_start_end = 0;
let mut it = rex.find_iter(text);
loop {
let Some(mut m) = it.next() else {
break;
};
if m.start() == trim_start_end {
trim_start_end = m.end();
continue;
}
let rem_start = m.start();
let mut hole_end = m.end();
loop {
if hole_end == text.len() {
return Cow::Borrowed(&text[trim_start_end..rem_start]);
}
if let Some(nm) = it.next() {
if nm.start() != m.end() {
let mut string = String::with_capacity(text.len() - trim_start_end);
string.push_str(&text[trim_start_end..rem_start]);
string.push_str(&text[m.end()..nm.start()]);
let mut last_end = nm.end();
loop {
let Some(m) = it.next() else {
string.push_str(&text[last_end..]);
return Cow::Owned(string);
};
string.push_str(&text[last_end..m.start()]);
last_end = m.end();
}
}
hole_end = nm.end();
m = nm;
} else {
dbg!(trim_start_end, rem_start, m.end(), text.len());
let len = (rem_start - trim_start_end) + (text.len() - m.end());
let mut string = String::with_capacity(len);
string.push_str(&text[trim_start_end..rem_start]);
string.push_str(&text[m.end()..]);
return Cow::Owned(string);
}
}
}
Cow::Borrowed(&text[trim_start_end..])
}
#[must_use]
#[cfg(not(feature = "lite"))]
pub fn bytes_remove_all_matches<'s>(
rex: ®ex::bytes::Regex,
text: &'s [u8],
) -> Cow<'s, [u8]> {
let mut trim_start_end = 0;
let mut it = rex.find_iter(text);
loop {
let Some(mut m) = it.next() else {
break;
};
if m.start() == trim_start_end {
trim_start_end = m.end();
continue;
}
let rem_start = m.start();
let mut hole_end = m.end();
loop {
if hole_end == text.len() {
return Cow::Borrowed(&text[trim_start_end..rem_start]);
}
if let Some(nm) = it.next() {
if nm.start() != m.end() {
let mut string = Vec::with_capacity(text.len() - trim_start_end);
string.extend_from_slice(&text[trim_start_end..rem_start]);
string.extend_from_slice(&text[m.end()..nm.start()]);
let mut last_end = nm.end();
loop {
let Some(m) = it.next() else {
string.extend_from_slice(&text[last_end..]);
return Cow::Owned(string);
};
string.extend_from_slice(&text[last_end..m.start()]);
last_end = m.end();
}
}
hole_end = nm.end();
m = nm;
} else {
dbg!(trim_start_end, rem_start, m.end(), text.len());
let len = (rem_start - trim_start_end) + (text.len() - m.end());
let mut string = Vec::with_capacity(len);
string.extend_from_slice(&text[trim_start_end..rem_start]);
string.extend_from_slice(&text[m.end()..]);
return Cow::Owned(string);
}
}
}
Cow::Borrowed(&text[trim_start_end..])
}