Skip to content

Commit c1e8414

Browse files
committed
Fix crashes in split(by captureRegex:)
1 parent c13681c commit c1e8414

File tree

1 file changed

+12
-10
lines changed

1 file changed

+12
-10
lines changed

Sources/Tokenizers/PreTokenizer.swift

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)