Auto merge of #36347 - knight42:str-replacen, r=alexcrichton
Implement std::str::replacen Replaces first N matches of a pattern with another string. ``` assert_eq!("acaaa".replacen(a, "b", 3), "bcbba") ```
This commit is contained in:
commit
16ff9e22cd
@ -1594,6 +1594,49 @@ impl str {
|
||||
result
|
||||
}
|
||||
|
||||
/// Replaces first N matches of a pattern with another string.
|
||||
///
|
||||
/// `replacen` creates a new [`String`], and copies the data from this string slice into it.
|
||||
/// While doing so, it attempts to find matches of a pattern. If it finds any, it
|
||||
/// replaces them with the replacement string slice at most `N` times.
|
||||
///
|
||||
/// [`String`]: string/struct.String.html
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// Basic usage:
|
||||
///
|
||||
/// ```
|
||||
/// # #![feature(str_replacen)]
|
||||
/// let s = "foo foo 123 foo";
|
||||
/// assert_eq!("new new 123 foo", s.replacen("foo", "new", 2));
|
||||
/// assert_eq!("faa fao 123 foo", s.replacen('o', "a", 3));
|
||||
/// assert_eq!("foo foo new23 foo", s.replacen(char::is_numeric, "new", 1));
|
||||
/// ```
|
||||
///
|
||||
/// When the pattern doesn't match:
|
||||
///
|
||||
/// ```
|
||||
/// # #![feature(str_replacen)]
|
||||
/// let s = "this is old";
|
||||
/// assert_eq!(s, s.replacen("cookie monster", "little lamb", 10));
|
||||
/// ```
|
||||
#[unstable(feature = "str_replacen",
|
||||
issue = "36436",
|
||||
reason = "only need to replace first N matches")]
|
||||
pub fn replacen<'a, P: Pattern<'a>>(&'a self, pat: P, to: &str, count: usize) -> String {
|
||||
// Hope to reduce the times of re-allocation
|
||||
let mut result = String::with_capacity(32);
|
||||
let mut last_end = 0;
|
||||
for (start, part) in self.match_indices(pat).take(count) {
|
||||
result.push_str(unsafe { self.slice_unchecked(last_end, start) });
|
||||
result.push_str(to);
|
||||
last_end = start + part.len();
|
||||
}
|
||||
result.push_str(unsafe { self.slice_unchecked(last_end, self.len()) });
|
||||
result
|
||||
}
|
||||
|
||||
/// Returns the lowercase equivalent of this string slice, as a new [`String`].
|
||||
///
|
||||
/// 'Lowercase' is defined according to the terms of the Unicode Derived Core Property
|
||||
|
@ -21,6 +21,7 @@
|
||||
#![feature(rand)]
|
||||
#![feature(step_by)]
|
||||
#![feature(str_escape)]
|
||||
#![feature(str_replacen)]
|
||||
#![feature(test)]
|
||||
#![feature(unboxed_closures)]
|
||||
#![feature(unicode)]
|
||||
|
@ -218,6 +218,20 @@ fn test_is_empty() {
|
||||
assert!(!"a".is_empty());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_replacen() {
|
||||
assert_eq!("".replacen('a', "b", 5), "");
|
||||
assert_eq!("acaaa".replacen("a", "b", 3), "bcbba");
|
||||
assert_eq!("aaaa".replacen("a", "b", 0), "aaaa");
|
||||
|
||||
let test = "test";
|
||||
assert_eq!(" test test ".replacen(test, "toast", 3), " toast toast ");
|
||||
assert_eq!(" test test ".replacen(test, "toast", 0), " test test ");
|
||||
assert_eq!(" test test ".replacen(test, "", 5), " ");
|
||||
|
||||
assert_eq!("qwer123zxc789".replacen(char::is_numeric, "", 3), "qwerzxc789");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_replace() {
|
||||
let a = "a";
|
||||
|
Loading…
x
Reference in New Issue
Block a user