2014-10-02 62 views
0

如果我有一個字符串象如下:字符串運算(子串)在夫特

「ABC;到期=星期四,16-OCT-2014十六點46分53秒GMT;路徑= /;」,並且我試圖提取expire=和下一個;之間的所有內容,以便我可以獲取時間戳,我將如何在Swift中執行此操作?我完全被字符和StringIndex的想法所困惑。我覺得下面的代碼會給我的" expire="字符串中的位置:

var range = cookie!.rangeOfString(" expires=");

我不明白不過,我應該從那裏去。

在Java類語言的算法將是這樣的:

1)找到索引的「到期=」;

2)將「expires =」後的所有內容的子串取爲完整字符串的結尾;

3)查看第一次出現的子字符串「;」

4)從索引0到索引3中找到的所有內容都是到期時間戳。

你如何去處理Swift字符串?

回答

1

個人而言,我會使用一個正則表達式的@ dasblinkenlight的解決方案去,但如果你想更喜歡的算法做一下你的問題,你可以:

let cookie: String = "abc; expires=Thu, 16-Oct-2014 16:46:53 GMT; path=/;" 
if let range = cookie.rangeOfString(" expires=") { 
    let expiresAndPath = cookie[range.endIndex..<cookie.endIndex] 
    if let semicolonRange = expiresAndPath.rangeOfString(";") { 
     let expires = expiresAndPath[expiresAndPath.startIndex..<semicolonRange.startIndex] 
     /* do something with expires */ 
    } 
} 

步驟逐步驟:

  1. 找到的索引 「期滿=」

let range = cookie.rangeOfString(" expires=")

  • 採取一切的子串後 「過期=」 完整字符串的結尾
  • let expiresAndPath = cookie[range.endIndex..<cookie.endIndex]

  • 在子串中查找第一個「;」
  • let semicolonRange = expiresAndPath.rangeOfString(";")

  • 一切從索引0至索引3中發現是期滿時間戳。
  • let expires = expiresAndPath[expiresAndPath.startIndex..<semicolonRange.startIndex]

    +0

    我接受你的答案,因爲它遵循我在OP中闡述的算法。雖然我發現這個範圍內的東西來自Java背景,但這無疑讓我更好地理解了這一點。謝謝! – thatidiotguy 2014-10-02 18:35:46

    3

    在斯威夫特,您可以使用正則表達式來搜索字符串,而不必應付NSRegularExpression明確:

    let str = "abc; expire=Thu, 16-Oct-2014 16:46:53 GMT; path=/;" 
    let range = str.rangeOfString("(?<=expire=)[^;]*", options: .RegularExpressionSearch) 
    if let range = optRange? { 
        print(str.substringWithRange(range)) 
    } else { 
        print("Not found") 
    } 
    

    正則表達式很簡單:[^;]*意味着「字符到第一個分號序列」; (?<=expire=)的意思是「只有在前面加上expire=字符串時才匹配」。

    Demo.

    +0

    我不反對在必要時使用正則表達式,但不應該有幾個基本的字符串操作,這將使我這樣做沒有他們? – thatidiotguy 2014-10-02 18:22:32

    +0

    @thatidiotguy絕對有可能將其重寫爲尋找子串的序列,在簡單的減法序列之後得到相同的結果。這將使單線解決方案成爲四線解決方案,從代碼閱讀者的角度來看,這是不理想的。 – dasblinkenlight 2014-10-02 18:41:37