it-swarm.com.de

swift 3 get start index (als int) von substring

Ich möchte die Anfangs- und Endposition eines Teilstrings innerhalb eines Strings erhalten. Beispiel: in der Zeichenfolge "hi das ist mein Name"; Wenn ich den String "this" gebe, würde ich gerne wissen, dass der Startindex 4 ist und der Endindex 7 ist.

Ich habe mehrere Links gefunden, darunter auch diesen:

Swift: Index des Beginns einer Teilzeichenfolge in einer Zeichenfolge abrufen A-Teilfolge in einer Zeichenfolge

In Swift 3 funktioniert es jedoch nicht, da die Methode jetzt als Range bezeichnet wird.

Ich verwende das jetzt:

let range = mystring.range(of: "StringSearch")?.lowerBound

was das zurückgibt

Swift.String.UnicodeScalarView.Index(_position: 15), _countUTF16: 1))

Ich kann die Position nicht als ganze Zahl erhalten, da dies ein Index ist.

Zusammenfassend möchte ich in einer Variablen vom Typ int die Position haben, in diesem Fall 15.

Kann mir jemand helfen?

Vielen Dank an alle.

14
rog

Die distance(from:to:) -Methode von String berechnet die Differenz Zwischen zwei String.Index-Werten:

let mystring = "hi this is my name"
if let range = mystring.range(of: "this") {
    let startPos = mystring.distance(from: mystring.startIndex, to: range.lowerBound)
    let endPos = mystring.distance(from: mystring.startIndex, to: range.upperBound)
    print(startPos, endPos) // 3 7
}

Tatsächlich leitet es den Aufruf einfach an die Variable CharacterView des Strings weiter, so dass .__

let mystring = "hi this is my name"
if let range = mystring.range(of: "this") {
    let startPos = mystring.characters.distance(from: mystring.characters.startIndex, to: range.lowerBound)
    let endPos = mystring.characters.distance(from: mystring.characters.startIndex, to: range.upperBound)
    print(startPos, endPos) // 3 7
}

Wenn Sie alle Vorkommen der Zeichenfolge benötigen:

let mystring = "this is this and that is that"
var searchPosition = mystring.startIndex
while let range = mystring.range(of: "this", range: searchPosition..<mystring.endIndex) {
    let startPos = mystring.distance(from: mystring.startIndex, to: range.lowerBound)
    let endPos = mystring.distance(from: mystring.startIndex, to: range.upperBound)
    print(startPos, endPos)

    searchPosition = range.upperBound
}
19
Martin R

Eine angepasste Antwort von Martin R in eine Funktion gibt Ihnen das erste Vorkommen als NSRange. Sie könnten dies auch in eine extension von String umwandeln.

public class func indexOf(string: String, substring: String) -> NSRange? {
    if let range = string.range(of: substring) {
        let startPos = string.distance(from: string.startIndex, to: range.lowerBound)
        return NSMakeRange(startPos, substring.count)
    }
}
1
GabeV