2015-04-02 194 views
24

如何在swift中獲得特定字符之前的字符串?下面的代碼是我在Objective C中做到的,但似乎無法在Swift中執行相同的任務。有關如何實現此目的的任何提示或建議? rangeOfString似乎根本不能在迅速(儘管斯威夫特已經爲我再次表演)。Swift:如何在特定字符之前獲取字符串?

NSRange range = [time rangeOfString:@" "]; 
NSString *startDate = 
[time substringToIndex:range.location]; 

正如你可以從代碼中看到上面我能夠空格字符之前得到的字符串中的目標C.

編輯:如果我嘗試這樣的事情

var string = "hello Swift" 
var range : NSRange = string.rangeOfString("Swift") 

我得到以下錯誤。

不能轉換表達式的類型「的NSString爲鍵入 '(字符串, 選項:NSStringCompareOptions,範圍:範圍?,區域: NSLocale)'

不知道我做錯了什麼確切或者如何正確解決它。

+0

在[這個答案](HTTP的: //堆棧溢出。com/a/24161872/2240769)他們也在Swift中使用rangeOfString,它似乎工作。 – 2015-04-02 20:25:19

+0

我編輯了我的問題,以更好地解釋當我嘗試應用您的解決方案時發生了什麼。 – 2015-04-02 20:30:38

+0

您可以使用'Range'而不是'NSRange':'let range:Range? = string.rangeOfString(「Swift」)'。您也可以將'String'強制轉換爲'NSString':'var range:NSRange =(string as NSString).rangeOfString(「Swift」)' – albertamg 2015-04-02 22:07:36

回答

56

使用componentsSeparatedByString(),如下所示:

var delimiter = " " 
var newstr = "token0 token1 token2 token3" 
var token = newstr.componentsSeparatedByString(delimiter) 
print (token[0]) 

或者用您的特定情況:

var delimiter = " token1" 
var newstr = "token0 token1 token2 token3" 
var token = newstr.componentsSeparatedByString(delimiter) 
print (token[0]) 

夫特3編輯:

與SWIFT 3,上述方法不再有效,請使用以下代碼:

var token = newstr.components(separatedBy: delimiter) 

如果這個編輯對你有幫助,請註冊登錄this answer

+0

非常棒的答案。我試圖弄清楚如何用rangeOfString完成這個任務,但這樣做效率更高。 – Adrian 2016-02-07 04:08:38

15

你可以做rangeOfString()同樣由String

let string = "Hello Swift" 
if let range = string.rangeOfString("Swift") { 
    let firstPart = string[string.startIndex..<range.startIndex] 
    print(firstPart) // print Hello 
} 

提供您也可以實現它與你的方法substringToIndex()

let string = "Hello Swift" 
if let range = string.rangeOfString("Swift") { 
    firstPart = string.substringToIndex(range.startIndex) 
    print(firstPart) // print Hello 
} 

斯威夫特3 UPDATE:

let string = "Hello Swift" 
if let range = string.range(of: "Swift") { 
    let firstPart = string[string.startIndex..<range.lowerBound] 
    print(firstPart) // print Hello 
} 

希望這可以幫助你;)

3

如果你想不涉及基礎拉動的解決方案,你可以用find和切片做到這一點:

let str = "Hello, I must be going." 

if let comma = find(str, ",") { 
    let substr = str[str.startIndex..<comma] 
    // substr will be "Hello" 
} 

如果要明確一個空字符串的情況下沒有這樣的字符被發現,可以使用零 - 結合運營商:

let str = "no comma" 
let comma = find(str, ",") ?? str.startIndex 
let substr = str[str.startIndex..<comma] // substr will be "" 

注意,不像componentsSeparatedByString技術,這並不需要一個數組的創建和ONL y需要掃描到字符的第一個出現位置,而不是將整個字符串分解爲以字符分隔的數組。

+0

是的......它的工作原理......但是如果我想在特定字符之後得到字符串呢? – 2015-06-04 10:15:42

+0

@Bhavin'find(str,「,」)?.後繼者()' – 2015-06-04 10:48:55

+2

@all'find'不再**支持Swift 2.0 – Honey 2016-08-29 21:06:22

1

您可以使用rangeOfString,但它返回一個Range<String.Index>類型,而不是一個NSRange

let string = "hello Swift" 
if let range = string.rangeOfString("Swift") { 
    print(string.substringToIndex(range.startIndex)) 
} 
2

變異一個串入一部分,直到指定的字符串的第一次出現,你可以擴展字符串是這樣的:

extension String { 

    mutating func until(_ string: String) { 
     var components = self.components(separatedBy: string) 
     self = components[0] 
    } 

} 

這可以被稱爲是這樣,那麼:

var foo = "Hello Swift" 
foo.until(" Swift") // foo is now "Hello" 
0

我的2美分:-)使用雨燕3.0,類似PHP strstr

extension String { 

    func strstr(needle: String, beforeNeedle: Bool = false) -> String? { 
     guard let range = self.range(of: needle) else { return nil } 

     if beforeNeedle { 
      return self.substring(to: range.lowerBound) 
     } 

     return self.substring(from: range.upperBound) 
    } 

} 

Usage1

"Hello, World!".strstr(needle: ",", beforeNeedle: true) // returns Hello 

Usage2

"Hello, World!".strstr(needle: " ") // returns World! 
3

上賽義德塔裏克的回答跟進:如果您只希望分隔符之前的字符串(否則,y OU接收陣列[字符串]):

var token = newstr.components(separatedBy: delimiter).first 
+0

這對我有用。謝謝。 – waseefakhtar 2017-06-22 18:03:59

1
let string = "Hello-world" 
if let range = string.range(of: "-") { 
let firstPart = string[(string.startIndex)..<range.lowerBound] 
print(firstPart) 
} 

輸出是:你好

0

下面是一種整體組合

let string = "This a string split using * and this is left." 
if let range = string.range(of: "*") { 
    let lastPartIncludingDelimiter = string.substring(from: range.lowerBound) 
    print(lastPartIncludingDelimiter) // print * and this is left. 

    let lastPartExcludingDelimiter = string.substring(from: range.upperBound) 
    print(lastPartExcludingDelimiter) // print and this is left. 

    let firstPartIncludingDelimiter = string.substring(to: range.upperBound) 
    print(firstPartIncludingDelimiter) // print This a string split using * 

    let firstPartExcludingDelimiter = string.substring(to: range.lowerBound) 
    print(firstPartExcludingDelimiter) // print This a string split using 
} 
相關問題