@@ -288,32 +288,34 @@ public extension String {
288288 let selfRange = NSRange ( startIndex..< endIndex, in: self )
289289 let matches = captureRegex. matches ( in: self , options: [ ] , range: selfRange)
290290
291- if matches. first == nil { return [ self ] }
291+ if matches. isEmpty { return [ self ] }
292292
293293 var result : [ String ] = [ ]
294294 var start = startIndex
295295 for match in matches {
296- // Append prefix before matched separator
297- let prefixEnd = index ( startIndex, offsetBy: match. range. lowerBound)
298- if start < prefixEnd {
299- result. append ( String ( self [ start..< prefixEnd ] ) )
296+ // Safely move the prefix end to the start of the current match
297+ let safePrefixEnd = index ( startIndex, offsetBy: match. range. lowerBound, limitedBy : endIndex ) ?? endIndex
298+ if start < safePrefixEnd {
299+ result. append ( String ( self [ start..< safePrefixEnd ] ) )
300300 }
301- start = index ( startIndex, offsetBy: match. range. upperBound)
301+
302+ // Safely move the start index to the end of the current match
303+ let matchEndIndex = index ( startIndex, offsetBy: match. range. upperBound, limitedBy: endIndex) ?? endIndex
304+ start = matchEndIndex
302305
303306 // Append separator, supporting capture groups
304307 for r in ( 0 ..< match. numberOfRanges) . reversed ( ) {
305308 let matchRange = match. range ( at: r)
306- if let sepRange = Range ( matchRange, in: self ) {
309+ if let sepRange = Range ( matchRange, in: self ) {
307310 result. append ( String ( self [ sepRange] ) )
308311 break
309312 }
310313 }
311314 }
312315
313316 // Append remaining suffix
314- let beginningOfEnd = index ( startIndex, offsetBy: matches. last!. range. upperBound)
315- if beginningOfEnd < endIndex {
316- result. append ( String ( self [ beginningOfEnd... ] ) )
317+ if start < endIndex {
318+ result. append ( String ( self [ start... ] ) )
317319 }
318320
319321 return result
0 commit comments