+ /// Returns a string slice with the prefix removed.
+ ///
+ /// If the string starts with the pattern `prefix`, `Some` is returned with the substring where
+ /// the prefix is removed. Unlike `trim_start_matches`, this method removes the prefix exactly
+ /// once.
+ ///
+ /// If the string does not start with `prefix`, it is removed.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// #![feature(str_strip)]
+ ///
+ /// assert_eq!("foobar".strip_prefix("foo"), Some("bar"));
+ /// assert_eq!("foobar".strip_prefix("bar"), None);
+ /// assert_eq!("foofoo".strip_prefix("foo"), Some("foo"));
+ /// ```
+ #[must_use = "this returns the remaining substring as a new slice, \
+ without modifying the original"]
+ #[unstable(feature = "str_strip", reason = "newly added", issue = "0")]
+ pub fn strip_prefix<'a, P: Pattern<'a>>(&'a self, prefix: P) -> Option<&'a str> {
+ let mut matcher = prefix.into_searcher(self);
+ if let SearchStep::Match(start, len) = matcher.next() {
+ debug_assert_eq!(start, 0);
+ unsafe {
+ Some(self.get_unchecked(len..))
+ }
+ } else {
+ None
+ }
+ }
+
+ /// Returns a string slice with the suffix removed.
+ ///
+ /// If the string starts with the pattern `suffix`, `Some` is returned with the substring where
+ /// the suffix is removed. Unlike `trim_end_matches`, this method removes the suffix exactly
+ /// once.
+ ///
+ /// If the string does not start with `suffix`, it is removed.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// #![feature(str_strip)]
+ /// assert_eq!("barfoo".strip_suffix("foo"), Some("bar"));
+ /// assert_eq!("barfoo".strip_suffix("bar"), None);
+ /// assert_eq!("foofoo".strip_suffix("foo"), Some("foo"));
+ /// ```
+ #[must_use = "this returns the remaining substring as a new slice, \
+ without modifying the original"]
+ #[unstable(feature = "str_strip", reason = "newly added", issue = "0")]
+ pub fn strip_suffix<'a, P>(&'a self, suffix: P) -> Option<&'a str>
+ where
+ P: Pattern<'a>,
+ <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>,
+ {
+ let mut matcher = suffix.into_searcher(self);
+ if let SearchStep::Match(start, end) = matcher.next_back() {
+ debug_assert_eq!(end, self.len());
+ unsafe {
+ Some(self.get_unchecked(..start))
+ }
+ } else {
+ None
+ }
+ }
+