2015-02-12 11 views
18

Należy określić, czy ciąg znaków zawiera którykolwiek ze znaków z zestawu niestandardowego, który zdefiniowałem.Jaki jest najlepszy sposób określenia, czy ciąg znaków zawiera znak z zestawu w Swift

Widzę z this posta, że ​​możesz użyć rangeOfString do określenia, czy ciąg zawiera inny ciąg. To oczywiście działa również dla postaci, jeśli testujesz każdą postać po jednej na raz.

Zastanawiam się, jaki jest najlepszy sposób na zrobienie tego.

+0

Chcesz sprawdzić, czy ciąg jest pusty, czy nie? – Cesare

+0

@CeceXX Nie, mam niestandardowy zestaw znaków, które chciałbym sprawdzić. – mattnedrich

+0

@mattnedrich: Dlaczego nie dodasz tej informacji do samego pytania? Zarówno treść pytań, jak i tytuł brzmią tak, jakbyś szukał * pojedynczej postaci * (co może być przyczyną negatywnego głosowania). –

Odpowiedz

32

można utworzyć CharacterSet zawierający zestaw niestandardowych znaków a następnie przetestować członkostwa przed tym zestawem znaków:

Swift 3:

let charset = CharacterSet(charactersIn: "aw") 
if str.rangeOfCharacter(from: charset) != nil { 
    print("yes") 
} 

Dla porównania bez rozróżniania wielkości liter użyj

if str.lowercased().rangeOfCharacter(from: charset) != nil { 
    print("yes") 
} 

(przy założeniu, że zestaw znaków zawiera tylko małe litery).

Swift 2:

let charset = NSCharacterSet(charactersInString: "aw") 
if str.rangeOfCharacterFromSet(charset) != nil { 
    print("yes") 
} 

Swift 1,2

let charset = NSCharacterSet(charactersInString: "aw") 
if str.rangeOfCharacterFromSet(charset, options: nil, range: nil) != nil { 
    println("yes") 
} 
+0

Dlaczego małe litery? Możliwe, że niestandardowy zestaw znaków wyklucza niektóre lub wszystkie małe litery. Ponadto CharacterSet jest zgodny z protokołem SetAlgebra; CharacterSet.isDisjoint() może być użyty do określenia, czy niestandardowy zestaw znaków ma jakiekolwiek wspólne elementy z wejściowym ciągiem znaków (zgodnie z odpowiedzią Chrisa Hattona poniżej, ale z zestawem znaków zamiast z zestawem). – Matt

+0

@Matt: Nie pamiętam, dlaczego dodałem konwersja małej litery, być może jako opcja lub ponieważ jest używana w pytaniach i odpowiedziach, do których odnosi się pytanie. Próbowałem to teraz wyjaśnić. - I tak, możesz napisać 'if! Charset.isDisjoint (with: CharacterSet (charactersIn: str))'. Czy to miałeś na myśli? Nie jestem pewien, czy jest prostszy czy bardziej wydajny. –

+0

@MartinR Czy wiesz, dlaczego 'rangeOfCharacter (from: charset, options: .caseInsensitive)' nie działa? –

2

Można zrobić to w ten sposób:

var string = "Hello, World!" 

if string.rangeOfString("W") != nil { 
    println("exists") 
} else { 
    println("doesn't exist") 
} 

// alternative: not case sensitive 
if string.lowercaseString.rangeOfString("w") != nil { 
    println("exists") 
} else { 
    println("doesn't exist") 
} 
7

Od Swift 1.2 można to zrobić za pomocą Set

var str = "Hello, World!" 
let charset: Set<Character> = ["e", "n"] 

charset.isSubsetOf(str)  // `true` if `str` contains all characters in `charset` 
charset.isDisjointWith(str) // `true` if `str` does not contains any characters in `charset` 
charset.intersect(str)  // set of characters both `str` and `charset` contains. 

Swift 3 lub później

let isSubset = charset.isSubset(of: str)  // `true` if `str` contains all characters in `charset` 
let isDisjoint = charset.isDisjoint(with: str) // `true` if `str` does not contains any characters in `charset` 
let intersection = charset.intersection(str) // set of characters both `str` and `charset` contains. 
print(intersection.count) // 1 
+1

W Swift 2.0, 'str' powinno być' str.characters' –

2
func isAnyCharacter(from charSetString: String, containedIn string: String) -> Bool 
{ 
    return Set(charSetString.characters).isDisjointWith(Set(string.characters)) == false 
} 
2

Swift 3:

let myString = "Some Words" 

if (myString.range(of: "Some") != nil){ 
    print("myString contains the word `Some`") 
}else{ 
    print("Word does not contain `Some`") 
} 
2

Korzystanie Swift 3 celu określenia, czy ciąg zawiera znaki z konkretnego CharacterSet:

let letters = CharacterSet.alphanumerics 
    let string = "my-string_" 
    if (string.trimmingCharacters(in: letters) != "") { 
     print("Invalid characters in string.") 
    } 
    else { 
     print("Only letters and numbers.") 
    } 
+2

Aby uzyskać prawdziwą odpowiedź Swift 3, powinieneś użyć 'CharacterSet' zamiast' NSCharacterSet'. – Moritz

+0

Dzięki, zaktualizowane. – AndyDunn

3

swift3

var str = "Hello, playground" 
let res = str.characters.contains { ["x", "z"].contains($0) } 
1

Swift 3 Przykład:

extension String{ 
    var isContainsLetters : Bool{ 
     let letters = CharacterSet.letters 
     return self.rangeOfCharacter(from: letters) != nil 
    } 
} 

Zastosowanie:

"123".isContainsLetters // false 
Powiązane problemy