|
8 | 8 | #![stable(feature = "rust1", since = "1.0.0")]
|
9 | 9 |
|
10 | 10 | use self::pattern::Pattern;
|
11 |
| -use self::pattern::{Searcher, ReverseSearcher, DoubleEndedSearcher}; |
| 11 | +use self::pattern::{Searcher, SearchStep, ReverseSearcher, DoubleEndedSearcher}; |
12 | 12 |
|
13 | 13 | use crate::char;
|
14 | 14 | use crate::fmt::{self, Write};
|
@@ -3791,6 +3791,73 @@ impl str {
|
3791 | 3791 | }
|
3792 | 3792 | }
|
3793 | 3793 |
|
| 3794 | + /// Returns a string slice with the prefix removed. |
| 3795 | + /// |
| 3796 | + /// If the string starts with the pattern `prefix`, `Some` is returned with the substring where |
| 3797 | + /// the prefix is removed. Unlike `trim_start_matches`, this method removes the prefix exactly |
| 3798 | + /// once. |
| 3799 | + /// |
| 3800 | + /// If the string does not start with `prefix`, it is removed. |
| 3801 | + /// |
| 3802 | + /// # Examples |
| 3803 | + /// |
| 3804 | + /// ``` |
| 3805 | + /// #![feature(str_strip)] |
| 3806 | + /// |
| 3807 | + /// assert_eq!("foobar".strip_prefix("foo"), Some("bar")); |
| 3808 | + /// assert_eq!("foobar".strip_prefix("bar"), None); |
| 3809 | + /// assert_eq!("foofoo".strip_prefix("foo"), Some("foo")); |
| 3810 | + /// ``` |
| 3811 | + #[must_use = "this returns the remaining substring as a new slice, \ |
| 3812 | + without modifying the original"] |
| 3813 | + #[unstable(feature = "str_strip", reason = "newly added", issue = "0")] |
| 3814 | + pub fn strip_prefix<'a, P: Pattern<'a>>(&'a self, prefix: P) -> Option<&'a str> { |
| 3815 | + let mut matcher = prefix.into_searcher(self); |
| 3816 | + if let SearchStep::Match(start, len) = matcher.next() { |
| 3817 | + debug_assert_eq!(start, 0); |
| 3818 | + unsafe { |
| 3819 | + Some(self.get_unchecked(len..)) |
| 3820 | + } |
| 3821 | + } else { |
| 3822 | + None |
| 3823 | + } |
| 3824 | + } |
| 3825 | + |
| 3826 | + /// Returns a string slice with the suffix removed. |
| 3827 | + /// |
| 3828 | + /// If the string starts with the pattern `suffix`, `Some` is returned with the substring where |
| 3829 | + /// the suffix is removed. Unlike `trim_end_matches`, this method removes the suffix exactly |
| 3830 | + /// once. |
| 3831 | + /// |
| 3832 | + /// If the string does not start with `suffix`, it is removed. |
| 3833 | + /// |
| 3834 | + /// # Examples |
| 3835 | + /// |
| 3836 | + /// ``` |
| 3837 | + /// #![feature(str_strip)] |
| 3838 | + /// assert_eq!("barfoo".strip_suffix("foo"), Some("bar")); |
| 3839 | + /// assert_eq!("barfoo".strip_suffix("bar"), None); |
| 3840 | + /// assert_eq!("foofoo".strip_suffix("foo"), Some("foo")); |
| 3841 | + /// ``` |
| 3842 | + #[must_use = "this returns the remaining substring as a new slice, \ |
| 3843 | + without modifying the original"] |
| 3844 | + #[unstable(feature = "str_strip", reason = "newly added", issue = "0")] |
| 3845 | + pub fn strip_suffix<'a, P>(&'a self, suffix: P) -> Option<&'a str> |
| 3846 | + where |
| 3847 | + P: Pattern<'a>, |
| 3848 | + <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, |
| 3849 | + { |
| 3850 | + let mut matcher = suffix.into_searcher(self); |
| 3851 | + if let SearchStep::Match(start, end) = matcher.next_back() { |
| 3852 | + debug_assert_eq!(end, self.len()); |
| 3853 | + unsafe { |
| 3854 | + Some(self.get_unchecked(..start)) |
| 3855 | + } |
| 3856 | + } else { |
| 3857 | + None |
| 3858 | + } |
| 3859 | + } |
| 3860 | + |
3794 | 3861 | /// Returns a string slice with all suffixes that match a pattern
|
3795 | 3862 | /// repeatedly removed.
|
3796 | 3863 | ///
|
|
0 commit comments