Comment vérifier par quoi une chaîne commence par (préfixe) ou se termine par (suffixe) dans Swift

102

J'essaie de tester si une chaîne Swift commence ou se termine par une certaine valeur. Ces méthodes n'existent pas:

var str = "Hello, playground"
str.startsWith("Hello") // error
str.endsWith("ground") // error

Je voudrais également obtenir les chaînes de préfixe et de suffixe. Je pourrais trouver une sous-chaîne, comme cela est répondu ici et ici , mais les plages sont une telle douleur dans Swift.

Y a-t-il un moyen plus simple de le faire?

(Je suis tombé sur la réponse lorsque je lisais la documentation , et comme une réponse SO n'est pas venue pour mes termes de recherche, j'ajoute mes questions et réponses ici.)

Suragch
la source

Réponses:

204

Mis à jour pour Swift 4

Vérifier par quoi une chaîne commence et se termine par

Vous pouvez utiliser les méthodes hasPrefix(_:)et hasSuffix(_:)pour tester l'égalité avec une autre chaîne.

let str = "Hello, playground"

if str.hasPrefix("Hello") { // true
    print("Prefix exists")
}

if str.hasSuffix("ground") { // true
    print("Suffix exists")
}

Obtention des sous-chaînes de préfixe et de suffixe réels

Afin d'obtenir le préfixe réel ou la sous-chaîne de suffixe, vous pouvez utiliser l'une des méthodes suivantes. Je recommande la première méthode pour sa simplicité. Toutes les méthodes utilisent strcomme

let str = "Hello, playground"

Méthode 1: (recommandée) prefix(Int)etsuffix(Int)

let prefix = String(str.prefix(5)) // Hello
let suffix = String(str.suffix(6)) // ground

C'est la meilleure méthode à mon avis. Contrairement aux méthodes 2 et 3 ci-dessous, cette méthode ne plantera pas si les index sortent des limites. Il renverra simplement tous les caractères de la chaîne.

let prefix = String(str.prefix(225)) // Hello, playground
let suffix = String(str.suffix(623)) // Hello, playground

Bien sûr, les plantages sont parfois bons car ils vous indiquent qu'il y a un problème avec votre code. Considérez donc également la deuxième méthode ci-dessous. Cela lancera une erreur si l'index sort des limites.

Méthode 2: prefix(upto:)etsuffix(from:)

Les index Swift String sont délicats car ils doivent prendre en compte des caractères spéciaux (comme les emoji). Cependant, une fois que vous obtenez l'index, il est facile d'obtenir le préfixe ou le suffixe. (Voir mon autre réponse sur String.Index.)

let prefixIndex = str.index(str.startIndex, offsetBy: 5)
let prefix = String(str.prefix(upTo: prefixIndex)) // Hello

let suffixIndex = str.index(str.endIndex, offsetBy: -6)
let suffix = String(str.suffix(from: suffixIndex)) // ground

Si vous voulez vous garder de sortir des limites, vous pouvez créer un index en utilisant limitedBy(encore une fois, voir cette réponse ).

Méthode 3: indices

Puisque String est une collection, vous pouvez utiliser des indices pour obtenir le préfixe et le suffixe.

let prefixIndex = str.index(str.startIndex, offsetBy: 5)
let prefix = String(str[..<prefixIndex]) // Hello

let suffixIndex = str.index(str.endIndex, offsetBy: -6)
let suffix = String(str[suffixIndex...]) // ground

Lectures complémentaires

Suragch
la source
5

Égalité des préfixes et des suffixes

Pour vérifier si une chaîne a un préfixe ou un suffixe de chaîne particulier, appelez les méthodes hasPrefix ( :) et hasSuffix ( :) de la chaîne , qui prennent toutes deux un seul argument de type String et renvoient une valeur booléenne.

Doc Apple

Gobi M
la source