2017-04-24 43 views
1

我明顯做錯了什麼,因爲這更新了我花了很長時間去做以下事情:(遊戲場代碼在下面)。Swift 3.1獲取兩個字符之間的範圍?

注:雨燕3.1〜

我只是想從piz(123)zazz

let aString = "piz(123)zazz" 

let startBracket: Character = "(" 
if let idx1 = aString.characters.index(of: startBracket) { 
    let pos1 = aString.characters.distance(from: aString.startIndex, to: idx1) 
    print("Found \(startBracket) at position \(pos1)") 
} 
else { 
    print("Not found") 
} 

let endBracket: Character = ")" 
if let idx2 = aString.characters.index(of: endBracket) { 
    let pos2 = aString.characters.distance(from: aString.startIndex, to: idx2) 
    print("Found \(startBracket) at position \(pos2)") 
} 
else { 
    print("Not found") 
} 

let range = pos1..<pos2 // << this is not working, I give up!!! 

let result_1 = aString.substring(with: range) 
+1

你應該在字符串,而不是字符來這樣做。獲取rangeOfString的上限或下限,並使用該值創建範圍 –

+1

爲了本主題的未來讀者,請在收到答案後不要破壞問題。 –

回答

2

這是很容易:

  • 開始指數是(
  • 範圍內的upperBound最終指數是)範圍的串

    lowerBound
    let aString = "piz(123)zazz" 
    
    if let openParenthesisRange = aString.range(of: "("), 
        let closeParenthesisRange = aString.range(of: ")", range: openParenthesisRange.upperBound..<aString.endIndex) { 
    
        let range = openParenthesisRange.upperBound..<closeParenthesisRange.lowerBound 
        let result = aString.substring(with: range) 
        print(result) 
    } 
    else { 
        print("Not found") 
    } 
    

或者正則表達式,它更多的代碼,但它更靈活

let string = "piz(123)zazz" 

let pattern = "\\((\\d+)\\)" // searches for 0 ore more digits between parentheses 

do { 
    let regex = try NSRegularExpression(pattern: pattern) 
    if let match = regex.firstMatch(in: string, range: NSRange(location: 0, length: string.utf16.count)) { 
     let range = match.rangeAt(1) 
     let start = string.index(string.startIndex, offsetBy: range.location) 
     let end = string.index(start, offsetBy: range.length) 
     print(string.substring(with: start..<end)) 
    } else { 
     print("Not Found") 
    } 
} catch { 
    print("Regex Error:", error) 
} 
+0

'if let start = aString.range(of:「(」)?. upperBound, let end = aString.range(of:「)」,range:start ..

+1

您可以使用openParenthesisRange upperboud作爲第二個rangeOfString範圍的startIndex。這樣您將只搜索左側的子字符串。不需要從字符串開頭搜索 –

+1

@LeoDabus更好,謝謝:-) – vadian

3

pos1pos2得到123出超出範圍,當你試圖使用。它們都是在if塊內定義的,它們的範圍本身就在那裏結束。

我會建議在頂部聲明它們使它們在範圍內。

let aString = "piz(123)zazz" 
let pos1: Int? // You don't need optional here but I prefer it 
let pos2: Int? 
. 
. 
. 
if let p1 = pos1, p2 = pos2 { // Optional Chaining 
    let range = pos1..<pos2 
}