函数在swift的string中查找字符串的所有nsrange



我想让所有CG字母对在DNA序列(字符串)的红色。我可以用NSMutableAttributedString。为此,我需要所有CG位置的nsrange,并且我已经尝试在

行中创建下面的函数
indexesOfStringIn = (stringOut as NSString).rangeOfString(stringIn, options: 0, range: rangeForIndexStringIn) 
带range的

rangeOfString不能被类型为(String, options: Int, range: NSRange)的参数列表调用。错误在哪里?我做错了什么?

func searchForNSRangesOfStringInString(stringOut: String, stringIn: String) -> [NSRange]
{
    var arrayOfindexesOfStringIn = [NSRange]()
if stringIn.characters.count > 1
{
    var rangeNS = (stringOut as NSString).rangeOfString(stringIn)
    if rangeNS.location != NSNotFound
    {
        let endIndexOfStringOut = (stringOut as NSString).length - 1
        var indexesOfStringIn = (stringOut as NSString).rangeOfString(stringIn)
        arrayOfindexesOfStringIn = [indexesOfStringIn]
        var lastIndexOfStringIn = (stringOut as NSString).rangeOfString(stringIn).location
        var rangeForIndexStringIn = NSRange(lastIndexOfStringIn...endIndexOfStringOut)
        while indexesOfStringIn.location != NSNotFound
        {
            indexesOfStringIn = (stringOut as NSString).rangeOfString(stringIn, options: 0, range: rangeForIndexStringIn)
            if indexesOfStringIn.location != NSNotFound
            {
                arrayOfindexesOfStringIn.append(indexesOfStringIn)
                lastIndexOfStringIn = (stringOut as NSString).rangeOfString(stringIn, options: 0, range: rangeForIndexStringIn).location
                rangeForIndexStringIn = NSRange(lastIndexOfStringIn...endIndexOfStringOut)
            }
        }
    }
}
return arrayOfindexesOfStringIn
} 

根据uchuugaka的建议,使用nsregulareexpression返回字符串中匹配范围的数组要容易得多,如下所示:

extension String {
    func findOccurencesOf(text text:String) -> [NSRange] {
        return !text.isEmpty ? try! NSRegularExpression(pattern: text, options: []).matchesInString(self, options: [], range: NSRange(0..<characters.count)).map{ $0.range } : []
    }
}
let str = "CGCGCGCGCG"
let ranges = str.findOccurencesOf(text: "CG")
print(ranges.count)   // 5

只需为您的textField编辑更改添加一个控制事件,并通过以下范围循环:

import UIKit
class ViewController: UIViewController {
    @IBOutlet weak var textField: UITextField!
    override func viewDidLoad() {
        super.viewDidLoad()
        textField.addTarget(self, action: "coloring:", forControlEvents: UIControlEvents.EditingChanged)
        textField.becomeFirstResponder()
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    func coloring(sender:UITextField) {
        let attText = NSMutableAttributedString(string: sender.text ?? "")
        let ranges = sender.text!.uppercaseString.findOccurencesOf(text: "CG")
        for range in ranges {
            attText.addAttributes([NSForegroundColorAttributeName : UIColor.redColor()], range: range)
        }
        sender.attributedText = attText
    }
}
extension String {
    func findOccurencesOf(text text:String) -> [NSRange] {
        return !text.isEmpty ? try! NSRegularExpression(pattern: text, options: []).matchesInString(self, options: [], range: NSRange(0..<characters.count)).map{ $0.range } : []
    }
}

最新更新