Number of occurrences of substring in string in Swift
A simple approach would be to split on "Swift"
, and subtract 1 from the number of parts:
let s = "hello Swift Swift and Swift"let tok = s.components(separatedBy:"Swift")print(tok.count-1)
This code prints 3.
Edit: Before Swift 3 syntax the code looked like this:
let tok = s.componentsSeparatedByString("Swift")
Optimising dwsolbergs solution to count faster. Also faster than componentsSeparatedByString
.
extension String { /// stringToFind must be at least 1 character. func countInstances(of stringToFind: String) -> Int { assert(!stringToFind.isEmpty) var count = 0 var searchRange: Range<String.Index>? while let foundRange = range(of: stringToFind, options: [], range: searchRange) { count += 1 searchRange = Range(uncheckedBounds: (lower: foundRange.upperBound, upper: endIndex)) } return count }}
Usage:
// return 2"aaaa".countInstances(of: "aa")
- If you want to ignore accents, you may replace
options: []
withoptions: .diacriticInsensitive
like dwsolbergs did. - If you want to ignore case, you may replace
options: []
withoptions: .caseInsensitive
like ConfusionTowers suggested. - If you want to ignore both accents and case, you may replace
options: []
withoptions: [.caseInsensitive, .diacriticInsensitive]
like ConfusionTowers suggested. - If, on the other hand, you want the fastest comparison possible and you can guarantee some canonical form for composed character sequences, then you may consider option
.literal
and it will only perform exact matchs.