Je voudrais obtenir la position de début et de fin d'une sous-chaîne dans une chaîne. Exemple: dans la chaîne "salut c'est mon nom"; Si je fournis la chaîne "this", j'aimerais savoir que l'indice de début est 4 et que l'indice de fin est 7.
J'ai trouvé plusieurs liens, dont celui-ci:
Swift: obtient l'index du début d'une sous-chaîne dans une chaîne Une-sous-chaîne-dans-une-chaîne
Mais cela ne fonctionne pas dans Swift 3 car la méthode s’appelle désormais range.
J'utilise maintenant ceci:
let range = mystring.range(of: "StringSearch")?.lowerBound
qui retourne cette
Swift.String.UnicodeScalarView.Index(_position: 15), _countUTF16: 1))
Et je ne peux pas obtenir la position en tant qu'entier car il s'agit d'un index.
En résumé, je voudrais avoir dans une variable de type int la position, dans ce cas 15.
Quelqu'un peut-il m'aider?
Merci tout le monde.
La méthode distance(from:to:)
de String
calcule la différence Entre deux valeurs String.Index
:
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
}
En fait, il transmet simplement l'appel à la chaîne CharacterView
, donc Ci-dessus donne le même résultat que
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
}
Si vous avez besoin de tous occurrences de la chaîne:
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
}
La réponse adaptée de Martin R dans une fonction vous donne la première occurrence sous la forme d'une NSRange
. Vous pouvez aussi transformer ceci en une extension
de String
.
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)
}
}