Swift: How to get substring from start to last index of character

前端 未结 22 851
感情败类
感情败类 2020-11-30 19:09

I want to learn the best/simplest way to turn a string into another string but with only a subset, starting at the beginning and going to the last index of a character.

22条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-11-30 19:42

    Do you want to get a substring of a string from start index to the last index of one of its characters? If so, you may choose one of the following Swift 2.0+ methods.

    Methods that require Foundation

    Get a substring that includes the last index of a character:

    import Foundation
    
    let string = "www.stackoverflow.com"
    if let rangeOfIndex = string.rangeOfCharacterFromSet(NSCharacterSet(charactersInString: "."), options: .BackwardsSearch) {
        print(string.substringToIndex(rangeOfIndex.endIndex))
    }
    
    // prints "www.stackoverflow."
    

    Get a substring that DOES NOT include the last index of a character:

    import Foundation
    
    let string = "www.stackoverflow.com"
    if let rangeOfIndex = string.rangeOfCharacterFromSet(NSCharacterSet(charactersInString: "."), options: .BackwardsSearch) {
        print(string.substringToIndex(rangeOfIndex.startIndex))
    }
    
    // prints "www.stackoverflow"
    

    If you need to repeat those operations, extending String can be a good solution:

    import Foundation
    
    extension String {
        func substringWithLastInstanceOf(character: Character) -> String? {
            if let rangeOfIndex = rangeOfCharacterFromSet(NSCharacterSet(charactersInString: String(character)), options: .BackwardsSearch) {
                return self.substringToIndex(rangeOfIndex.endIndex)
            }
            return nil
        }
        func substringWithoutLastInstanceOf(character: Character) -> String? {
            if let rangeOfIndex = rangeOfCharacterFromSet(NSCharacterSet(charactersInString: String(character)), options: .BackwardsSearch) {
                return self.substringToIndex(rangeOfIndex.startIndex)
            }
            return nil
        }
    }
    
    print("www.stackoverflow.com".substringWithLastInstanceOf("."))
    print("www.stackoverflow.com".substringWithoutLastInstanceOf("."))
    
    /*
    prints:
    Optional("www.stackoverflow.")
    Optional("www.stackoverflow")
    */
    

    Methods that DO NOT require Foundation

    Get a substring that includes the last index of a character:

    let string = "www.stackoverflow.com"
    if let reverseIndex = string.characters.reverse().indexOf(".") {
        print(string[string.startIndex ..< reverseIndex.base])
    }
    
    // prints "www.stackoverflow."
    

    Get a substring that DOES NOT include the last index of a character:

    let string = "www.stackoverflow.com"
    if let reverseIndex = string.characters.reverse().indexOf(".") {
        print(string[string.startIndex ..< reverseIndex.base.advancedBy(-1)])
    }
    
    // prints "www.stackoverflow"
    

    If you need to repeat those operations, extending String can be a good solution:

    extension String {
        func substringWithLastInstanceOf(character: Character) -> String? {
            if let reverseIndex = characters.reverse().indexOf(".") {
                return self[self.startIndex ..< reverseIndex.base]
            }
            return nil
        }
        func substringWithoutLastInstanceOf(character: Character) -> String? {
            if let reverseIndex = characters.reverse().indexOf(".") {
                return self[self.startIndex ..< reverseIndex.base.advancedBy(-1)]
            }
            return nil
        }
    }
    
    print("www.stackoverflow.com".substringWithLastInstanceOf("."))
    print("www.stackoverflow.com".substringWithoutLastInstanceOf("."))
    
    /*
    prints:
    Optional("www.stackoverflow.")
    Optional("www.stackoverflow")
    */
    

提交回复
热议问题