函数在 swift 中的字符串中查找字符串的所有 NSRanges
function to find all NSRanges for a string in string in swift
我希望 DNA 序列(字符串)中的所有 CG 字母对都显示为红色。我可以使用 NSMutableAttributedString 来完成。
为此,我需要所有 CG 位置的 NSRanges,我尝试在下面创建函数,但在
行中
indexesOfStringIn = (stringOut as NSString).rangeOfString(stringIn, options: 0, range: rangeForIndexStringIn)
rangeOfString with range 不能用类型参数列表调用(字符串,选项: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
}
正如 uchuugaka 所建议的,使用 NSRegularExpression 来 return 字符串中匹配范围的数组要容易得多,如下所示:
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{ [=10=].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{ [=11=].range } : []
}
}
我希望 DNA 序列(字符串)中的所有 CG 字母对都显示为红色。我可以使用 NSMutableAttributedString 来完成。 为此,我需要所有 CG 位置的 NSRanges,我尝试在下面创建函数,但在
行中indexesOfStringIn = (stringOut as NSString).rangeOfString(stringIn, options: 0, range: rangeForIndexStringIn)
rangeOfString with range 不能用类型参数列表调用(字符串,选项: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
}
正如 uchuugaka 所建议的,使用 NSRegularExpression 来 return 字符串中匹配范围的数组要容易得多,如下所示:
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{ [=10=].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{ [=11=].range } : []
}
}