簡體   English   中英

Swift 3.1獲取兩個char之間的范圍?

[英]Swift 3.1 Get a range between two char?

我顯然做錯了什么,因為這對我做了以下事情已經花了很長時間:(下面的游樂場代碼)。

注意:Swift 3.1~

我只想從piz(123)zazz獲得123

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)

它更容易:

  • 起始索引是(在字符串中)范圍的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)
}

當您嘗試使用時,您的pos1pos2超出了范圍。 它們都在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
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM