2016-04-10 15 views
1

Wie kann ich die erste Position eines Zeichens in einem Teilstring finden. Nicht in der gesamten Zeichenfolge, sondern nach einer angegebenen Zeichenposition.Finden Sie die Position des Zeichens in einem Teilstring

Beispiel:

var str = "This is a test string" 
//find the position of first "i" after "is" 

let position = str.firstPositionOfIAfterPosition(5) // returns 18 

Ich weiß, dass ich die gesamte erste Position mit dem Code unten finden. Wie kann ich das erweitern, um erst nach einer bestimmten Zeichenposition zu suchen?

let position = str.rangeOfString("i").startIndex 

Antwort

1
var s = "This is a test string" 
var targetRange = s.characters.indices 
targetRange.startIndex = targetRange.startIndex.advancedBy(6) // skip past 
let r = s.rangeOfString("i", options: [], range: targetRange, locale: nil) 
// 18..<19 
+1

(Sie können den 'locale weglassen: nil', hat dieser Parameter einen Standardwert.) –

+1

@MartinR Ich weiß, aber ich wünschte, Code-Vervollständigung würde mir das zeigen. Ich habe hier einen Fehler gemeldet, aber es kommt immer wieder zu mir zurück; Apple scheint nicht zu verstehen, was das Problem ist. – matt

1
var str = "This is a test string" 


func getIndexAfterString(string: String) -> Int { 
    let firstIndex = str.rangeOfString(string)?.startIndex.advancedBy(string.characters.count) 
    let i: Int = str.startIndex.distanceTo(firstIndex!) 
    let secondIndex = str.substringFromIndex(firstIndex!).rangeOfString("i")?.startIndex 
    let j: Int = str.startIndex.distanceTo(secondIndex!) 
    return i + j 
} 

let index: Int = getIndexAfterString(" is ") //18 
1

ähnlich wie Matts Antwort, aber als String Erweiterung und mit Fehlerbehandlung

extension String { 

    func firstPositionOf(string: String, afterPosition index: Int) -> String.Index? 
    { 
    if self.isEmpty || self.characters.count - 1 < index { return nil } 
    let subRange = Range<String.Index>(self.startIndex.advancedBy(index + 1)..<self.endIndex) 
    guard let foundRange = self.rangeOfString(string, options: [], range: subRange) else { return nil } 
    return foundRange.startIndex 
    } 
} 

let str = "This is a test string" 

let position = str.firstPositionOf("i", afterPosition:5) // -> 18 
Verwandte Themen