@@ -1157,25 +1157,21 @@ impl str {
11571157 core_str:: StrExt :: rmatches ( self , pat)
11581158 }
11591159
1160- /// An iterator over the start and end indices of the disjoint matches
1161- /// of a pattern within `self` .
1160+ /// An iterator over the disjoint matches of a pattern within `self` as well
1161+ /// as the index that the match starts at .
11621162 ///
11631163 /// For matches of `pat` within `self` that overlap, only the indices
1164- /// corresponding to the first
1165- /// match are returned.
1164+ /// corresponding to the first match are returned.
11661165 ///
1167- /// The pattern can be a simple `&str`, `char`, or a closure that
1168- /// determines if a character matches.
1169- /// Additional libraries might provide more complex patterns like
1170- /// regular expressions.
1166+ /// The pattern can be a simple `&str`, `char`, or a closure that determines
1167+ /// if a character matches. Additional libraries might provide more complex
1168+ /// patterns like regular expressions.
11711169 ///
11721170 /// # Iterator behavior
11731171 ///
11741172 /// The returned iterator will be double ended if the pattern allows a
1175- /// reverse search
1176- /// and forward/reverse search yields the same elements. This is true for,
1177- /// eg, `char` but not
1178- /// for `&str`.
1173+ /// reverse search and forward/reverse search yields the same elements. This
1174+ /// is true for, eg, `char` but not for `&str`.
11791175 ///
11801176 /// If the pattern allows a reverse search but its results might differ
11811177 /// from a forward search, `rmatch_indices()` can be used.
@@ -1185,42 +1181,36 @@ impl str {
11851181 /// ```
11861182 /// #![feature(str_match_indices)]
11871183 ///
1188- /// let v: Vec<(usize, usize) > = "abcXXXabcYYYabc".match_indices("abc").collect();
1189- /// assert_eq!(v, [(0, 3 ), (6, 9 ), (12, 15 )]);
1184+ /// let v: Vec<_ > = "abcXXXabcYYYabc".match_indices("abc").collect();
1185+ /// assert_eq!(v, [(0, "abc" ), (6, "abc" ), (12, "abc" )]);
11901186 ///
1191- /// let v: Vec<(usize, usize) > = "1abcabc2".match_indices("abc").collect();
1192- /// assert_eq!(v, [(1, 4 ), (4, 7 )]);
1187+ /// let v: Vec<_ > = "1abcabc2".match_indices("abc").collect();
1188+ /// assert_eq!(v, [(1, "abc" ), (4, "abc" )]);
11931189 ///
1194- /// let v: Vec<(usize, usize) > = "ababa".match_indices("aba").collect();
1195- /// assert_eq!(v, [(0, 3 )]); // only the first `aba`
1190+ /// let v: Vec<_ > = "ababa".match_indices("aba").collect();
1191+ /// assert_eq!(v, [(0, "aba" )]); // only the first `aba`
11961192 /// ```
11971193 #[ unstable( feature = "str_match_indices" ,
11981194 reason = "might have its iterator type changed" ,
11991195 issue = "27743" ) ]
1200- // NB: Right now MatchIndices yields `(usize, usize)`, but it would
1201- // be more consistent with `matches` and `char_indices` to return `(usize, &str)`
12021196 pub fn match_indices < ' a , P : Pattern < ' a > > ( & ' a self , pat : P ) -> MatchIndices < ' a , P > {
12031197 core_str:: StrExt :: match_indices ( self , pat)
12041198 }
12051199
1206- /// An iterator over the start and end indices of the disjoint matches of
1207- /// a pattern within
1208- /// `self`, yielded in reverse order.
1200+ /// An iterator over the disjoint matches of a pattern within `self`,
1201+ /// yielded in reverse order along with the index of the match.
12091202 ///
12101203 /// For matches of `pat` within `self` that overlap, only the indices
1211- /// corresponding to the last
1212- /// match are returned.
1204+ /// corresponding to the last match are returned.
12131205 ///
1214- /// The pattern can be a simple `&str`, `char`, or a closure that
1215- /// determines if a character matches.
1216- /// Additional libraries might provide more complex patterns like
1217- /// regular expressions.
1206+ /// The pattern can be a simple `&str`, `char`, or a closure that determines
1207+ /// if a character matches. Additional libraries might provide more complex
1208+ /// patterns like regular expressions.
12181209 ///
12191210 /// # Iterator behavior
12201211 ///
1221- /// The returned iterator requires that the pattern supports a
1222- /// reverse search,
1223- /// and it will be double ended if a forward/reverse search yields
1212+ /// The returned iterator requires that the pattern supports a reverse
1213+ /// search, and it will be double ended if a forward/reverse search yields
12241214 /// the same elements.
12251215 ///
12261216 /// For iterating from the front, `match_indices()` can be used.
@@ -1230,20 +1220,18 @@ impl str {
12301220 /// ```
12311221 /// #![feature(str_match_indices)]
12321222 ///
1233- /// let v: Vec<(usize, usize) > = "abcXXXabcYYYabc".rmatch_indices("abc").collect();
1234- /// assert_eq!(v, [(12, 15 ), (6, 9 ), (0, 3 )]);
1223+ /// let v: Vec<_ > = "abcXXXabcYYYabc".rmatch_indices("abc").collect();
1224+ /// assert_eq!(v, [(12, "abc" ), (6, "abc" ), (0, "abc" )]);
12351225 ///
1236- /// let v: Vec<(usize, usize) > = "1abcabc2".rmatch_indices("abc").collect();
1237- /// assert_eq!(v, [(4, 7 ), (1, 4 )]);
1226+ /// let v: Vec<_ > = "1abcabc2".rmatch_indices("abc").collect();
1227+ /// assert_eq!(v, [(4, "abc" ), (1, "abc" )]);
12381228 ///
1239- /// let v: Vec<(usize, usize) > = "ababa".rmatch_indices("aba").collect();
1240- /// assert_eq!(v, [(2, 5 )]); // only the last `aba`
1229+ /// let v: Vec<_ > = "ababa".rmatch_indices("aba").collect();
1230+ /// assert_eq!(v, [(2, "aba" )]); // only the last `aba`
12411231 /// ```
12421232 #[ unstable( feature = "str_match_indices" ,
12431233 reason = "might have its iterator type changed" ,
12441234 issue = "27743" ) ]
1245- // NB: Right now RMatchIndices yields `(usize, usize)`, but it would
1246- // be more consistent with `rmatches` and `char_indices` to return `(usize, &str)`
12471235 pub fn rmatch_indices < ' a , P : Pattern < ' a > > ( & ' a self , pat : P ) -> RMatchIndices < ' a , P >
12481236 where P :: Searcher : ReverseSearcher < ' a >
12491237 {
@@ -1416,10 +1404,10 @@ impl str {
14161404 pub fn replace ( & self , from : & str , to : & str ) -> String {
14171405 let mut result = String :: new ( ) ;
14181406 let mut last_end = 0 ;
1419- for ( start, end ) in self . match_indices ( from) {
1407+ for ( start, part ) in self . match_indices ( from) {
14201408 result. push_str ( unsafe { self . slice_unchecked ( last_end, start) } ) ;
14211409 result. push_str ( to) ;
1422- last_end = end ;
1410+ last_end = start + part . len ( ) ;
14231411 }
14241412 result. push_str ( unsafe { self . slice_unchecked ( last_end, self . len ( ) ) } ) ;
14251413 result
0 commit comments