mattnedrich
mattnedrich

Reputation: 8022

What is the best way to determine if a string contains a character from a set in Swift

I need to determine if a string contains any of the characters from a custom set that I have defined.

I see from this post that you can use rangeOfString to determine if a string contains another string. This, of course, also works for characters if you test each character one at a time.

I'm wondering what the best way to do this is.

Upvotes: 61

Views: 74805

Answers (11)

multitudes
multitudes

Reputation: 3525

Updated for Swift 5.1

Question was specifically: "if a string contains any of the characters from a custom set" and not checking for all characters in the custom set.

Using

func check(in string: String, forAnyIn characters: String) -> Bool {
    // create one character set
    let customSet = CharacterSet(charactersIn: characters)
    // use the rangeOfCharacter(from: CharacterSet) function
    return string.rangeOfCharacter(from: customSet) != nil 
}

check(in: "abc", forAnyIn: "A") // false
check(in: "abc", forAnyIn: "b") // true

But this is also very easy to check using character sets.


func check(in string: String, forAnyIn characters: String) -> Bool {
    let customSet = CharacterSet(charactersIn: characters)
    let inputSet = CharacterSet(charactersIn: string)
    return !inputSet.intersection(customSet).isEmpty
}

check(in: "abc", forAnyIn: "A") // false
check(in: "abc", forAnyIn: "b") // true

Upvotes: 1

Tung Fam
Tung Fam

Reputation: 8147

ONE LINE Swift4 solution to check if contains letters:

CharacterSet.letters.isSuperset(of: CharacterSet(charactersIn: myString) // returns BOOL

Another case when you need to validate string for custom char sets. For example if string contains only letters and (for example) dashes and spaces:

let customSet: CharacterSet = [" ", "-"]
let finalSet = CharacterSet.letters.union(customSet)
finalSet.isSuperset(of: CharacterSet(charactersIn: myString)) // BOOL

Hope it helps someone one day:)

Upvotes: 24

Use like this in swift 4.2

    var string = "Hello, World!"
    let charSet = NSCharacterSet.letters
    if string.rangeOfCharacter(from:charSet)?.isEmpty == false{  
      print ("String contain letters");
    }

Upvotes: -1

fs_tigre
fs_tigre

Reputation: 10738

Swift 4

let myString = "Some Words"

if myString.contains("Some"){
    print("myString contains the word `Some`")
}else{
    print("myString does NOT contain the word `Some`")
}

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`")
}

Upvotes: 1

rintaro
rintaro

Reputation: 51911

From Swift 1.2 you can do that using 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 or later

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

Upvotes: 7

Maor
Maor

Reputation: 3430

Swift 3 example:

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

Usage :

"123".isContainsLetters // false

Upvotes: 9

Martin R
Martin R

Reputation: 539775

You can create a CharacterSet containing the set of your custom characters and then test the membership against this character set:

Swift 3:

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

For case-insensitive comparison, use

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

(assuming that the character set contains only lowercase letters).

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")
}

Upvotes: 101

AndyDunn
AndyDunn

Reputation: 1084

Using Swift 3 to determine if your string contains characters from a specific 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.")
    }

Upvotes: 3

t4ncr3d3
t4ncr3d3

Reputation: 615

swift3

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

Upvotes: 4

Chris Hatton
Chris Hatton

Reputation: 828

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

Upvotes: 2

Cesare
Cesare

Reputation: 9419

You could do it this way:

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")
}

Upvotes: 0

Related Questions