【问题标题】:function to find all NSRanges for a string in string in swift快速查找字符串中字符串的所有NSRange的函数
【发布时间】:2015-09-27 08:44:03
【问题描述】:

我想在 DNA 序列(字符串)中将所有 CG 字母对设为红色。我可以通过使用 NSMutableAttributedString 来做到这一点。 为此,我需要所有 CG 位置的 NSRange,并且我尝试在下面创建函数,但在

indexesOfStringIn = (stringOut as NSString).rangeOfString(stringIn, options: 0, range: rangeForIndexStringIn) 

rangeOfString 不能使用类型参数列表(字符串,选项:Int,范围: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
} 

【问题讨论】:

  • 只需使用 NSRegularExpression
  • 好的,但是我的代码有什么错误?可能这很简单,但我被卡住了。

标签: swift nsrange


【解决方案1】:

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

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 } : []
    }
}

【讨论】:

  • 谢谢,很好的解决方案,我可能会在最后使用它!我正在学习过程中,所以我不明白为什么带有 range 的 rangeOfString 是错误的,而 NSString 应该没问题,这让我迷失了 :(.
  • 选项中的 [ ] 是什么意思:?
  • 表示与 nil 相同 = 无选项
  • 这是一个空选项集
  • !!!我以前用过 nil ,但它是不正确的。当我开始在 rangeOfString(stringIn, options: [ ], range: rangeForIndexStringIn) 的选项中使用 [ ] 时,我再也看不到任何抱怨了!
猜你喜欢
  • 2017-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-20
相关资源
最近更新 更多