2016-04-10 3 views
1

Как найти первую позицию символа в подстроке. Не в строке в целом, а в первой после указанной позиции символа.найти позицию символа в подстроке

Пример:

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

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

Я знаю, что я могу найти общую первую позицию с кодом ниже. Как я могу продлить это, чтобы начать поиск только после указанной позиции символа?

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

ответ

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

ошибки (Вы можете опустить 'локали: nil', что параметр имеет значение по умолчанию.) –

+1

@MartinR Я знаю, но я хочу, чтобы завершение кода показало мне это. Я подал ошибку, но он все время возвращается ко мне; Apple, похоже, не понимает, в чем проблема. – 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

Подобный ответ Мэтта, но String расширения и обработки

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