How to find all positions of one string in another string in swift2 ?

后端 未结 4 1383
执念已碎
执念已碎 2021-01-02 06:12

I can find first position of string \"ATG\" in myString \"ATGGACGTGAGCTGATCGATGGCTGAAATGAAAA\" (i.e. index range is 0..<3) by using code below. Question is how to find al

4条回答
  •  天命终不由人
    2021-01-02 06:48

    You can use NSRegularExpression to find all occurrences of your string:

    Swift 1.2:

    let mystr = "ATGGACGTGAGCTGATCGATGGCTGAAATGAAAA"
    let searchstr = "ATG"
    let ranges: [NSRange]
    
    // Create the regular expression.
    if let regex = NSRegularExpression(pattern: searchstr, options: nil, error: nil) {
        // Use the regular expression to get an array of NSTextCheckingResult.
        // Use map to extract the range from each result.
        ranges = regex.matchesInString(mystr, options: nil, range: NSMakeRange(0, count(mystr))).map {$0.range}
    
    } else {
        // There was a problem creating the regular expression
        ranges = []
    }
    
    println(ranges)  // prints [(0,3), (18,3), (27,3)]
    

    Swift 2:

    let mystr = "ATGGACGTGAGCTGATCGATGGCTGAAATGAAAA"
    let searchstr = "ATG"
    let ranges: [NSRange]
    
    do {
        // Create the regular expression.
        let regex = try NSRegularExpression(pattern: searchstr, options: [])
    
        // Use the regular expression to get an array of NSTextCheckingResult.
        // Use map to extract the range from each result.
        ranges = regex.matchesInString(mystr, options: [], range: NSMakeRange(0, mystr.characters.count)).map {$0.range}
    }
    catch {
        // There was a problem creating the regular expression
        ranges = []
    }
    
    print(ranges)  // prints [(0,3), (18,3), (27,3)]
    

    Swift 3: using Swift's native Range type.

    let mystr = "ATGGACGTGAGCTGATCGATGGCTGAAATGAAAA"
    let searchstr = "ATG"
    
    do {
        // Create the regular expression.
        let regex = try NSRegularExpression(pattern: searchstr, options: [])
    
        // Use the regular expression to get an array of NSTextCheckingResult.
        // Use map to extract the range from each result.
        let fullStringRange = mystr.nsRange(from: mystr.startIndex ..< mystr.endIndex)          
        let matches = regex.matches(in: mystr, options: [], range: fullStringRange)
        let ranges = matches.map {$0.range}
        print(ranges)  // prints [(0,3), (18,3), (27,3)]
    }
    catch {}
    

    Notes:

    • This method has its limitations. You'll be fine if the string you are searching for is simple text, but if the string contains symbols (such as "+*()[].{}?\^$") which have special meaning in a regular expression, then this will not work as expected. You could preprocess the search string to add escapes to nullify the special meanings of those characters, but this is probably more trouble than it is worth.
    • Another limitation can be demonstrated when mystr is "AAAA" and searchstr is "AA". In this case, the string will only be found twice. The middle AA will not be found because it starts with a character that is part of the first range.

提交回复
热议问题