about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorknight42 <knight42@mail.ustc.edu.cn>2016-09-08 18:54:45 +0800
committerknight42 <knight42@mail.ustc.edu.cn>2016-09-13 10:16:31 +0800
commitbe2fa70c1604f4383463fa4e64cd9f4567ff47e8 (patch)
treef0ac8a915e3c5b516f987bcdaa7e2fa216603eea /src
parent5531c314a2855aec368e811da6fcd9e98365af51 (diff)
downloadrust-be2fa70c1604f4383463fa4e64cd9f4567ff47e8.tar.gz
rust-be2fa70c1604f4383463fa4e64cd9f4567ff47e8.zip
Implement std::str::replacen
Diffstat (limited to 'src')
-rw-r--r--src/libcollections/str.rs43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/libcollections/str.rs b/src/libcollections/str.rs
index 999c84ba705..6a6b450e518 100644
--- a/src/libcollections/str.rs
+++ b/src/libcollections/str.rs
@@ -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