Jak sprawdzić, od czego ciąg znaków zaczyna się (prefiks) lub kończy (sufiks) w języku Swift

102

Próbuję sprawdzić, czy ciąg Swift zaczyna się lub kończy z określoną wartością. Te metody nie istnieją:

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

Chciałbym również uzyskać ciągi przedrostków i sufiksów. Mogłem znaleźć podciąg, tak jak tu i tutaj , ale zakresy są bardzo uciążliwe w Swifcie.

Czy jest na to łatwiejszy sposób?

(Natknąłem się na odpowiedź, kiedy czytałem dokumentację , a ponieważ nie pojawiła się odpowiedź SO dla moich wyszukiwanych haseł, dodaję tutaj moje pytania i odpowiedzi).

Suragch
źródło

Odpowiedzi:

204

Zaktualizowano dla Swift 4

Sprawdzanie, czym String zaczyna się, a czym kończy

Możesz użyć metod hasPrefix(_:)i hasSuffix(_:), aby przetestować równość z innym ciągiem znaków.

let str = "Hello, playground"

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

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

Pobieranie rzeczywistego prefiksu i podciągów sufiksu

Aby uzyskać rzeczywisty fragment prefiksu lub sufiksu, możesz użyć jednej z następujących metod. Polecam pierwszą metodę ze względu na jej prostotę. Wszystkie metody używają strjako

let str = "Hello, playground"

Metoda 1: (zalecane) prefix(Int)isuffix(Int)

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

Moim zdaniem to lepsza metoda. W przeciwieństwie do metod 2 i 3 poniżej, ta metoda nie ulegnie awarii, jeśli indeksy wyjdą poza granice. Po prostu zwróci wszystkie znaki w ciągu.

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

Oczywiście czasami awarie są dobre, ponieważ informują o problemie z Twoim kodem. Rozważ więc również drugą metodę poniżej. Jeśli indeks wyjdzie poza granice, zwróci błąd.

Metoda 2: prefix(upto:)isuffix(from:)

Indeksy Swift String są trudne, ponieważ muszą uwzględniać znaki specjalne (takie jak emoji). Jednak po uzyskaniu indeksu łatwo jest uzyskać przedrostek lub sufiks. (Zobacz inne moje odpowiedzi na 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

Jeśli chcesz ustrzec się przed przekroczeniem granic, możesz utworzyć indeks za pomocą limitedBy(ponownie, zobacz tę odpowiedź ).

Metoda 3: indeksy dolne

Ponieważ String jest kolekcją, możesz użyć indeksów dolnych, aby uzyskać przedrostek i sufiks.

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

Dalsze czytanie

Suragch
źródło
5

Równość przedrostków i przyrostków

Aby sprawdzić, czy łańcuch ma określony prefiks lub sufiks, wywołaj metody hasPrefix ( :) i hasSuffix ( :), z których obie pobierają pojedynczy argument typu String i zwracają wartość logiczną.

Apple Doc

Gobi M
źródło