簡體   English   中英

在 Swift 中使用特殊字符轉義正則表達式

[英]Escaping Regex with special characters in Swift

我有一個相對復雜的正則表達式,需要在 Swift 中運行。 原來是:

"typedef\\W+struct\\W+{([^}]*)}\\W+(\\w+);"

你可以在這里看到在 JS 中工作的模式。

為了讓它在 Swift 中編譯,我將反斜杠轉義為:

"typedef\\\\W+struct\\\\W+{([^}]*)}\\\\W+(\\\\w+);"

在運行時,表達式無法編譯,並出現2048錯誤。 我也嘗試轉義其他字符,也嘗試過escapedPatternForString但沒有運氣。 是否有將 JS 正則表達式轉換為 Swift 的腳本? 謝謝!

您需要轉義字符類之外{}

let rx = "typedef\\W+struct\\W+\\{([^}]*)\\}\\W+(\\w+);"

快速演示:

let rx = "typedef\\W+struct\\W+\\{([^}]*)\\}\\W+(\\w+);"
let str = "typedef: struct { something } text;"
print(str.range(of: rx, options: .regularExpression) != nil) 
// => true

{}在字符類中時,它們可能保持未轉義(如[^}] )。

使用此代碼Confused Vorlon 的回答),您可以獲得所有捕獲組的第一個匹配項:

extension NSTextCheckingResult {
    func groups(testedString:String) -> [String] {
        var groups = [String]()
        for i in  0 ..< self.numberOfRanges
        {
            let group = String(testedString[Range(self.range(at: i), in: testedString)!])
            groups.append(group)
        }
        return groups
    }
}

let str = "typedef: struct { something } text;"
let rx = "typedef\\W+struct\\W+\\{([^}]*)\\}\\W+(\\w+);"
let MyRegex = try! NSRegularExpression(pattern: rx)
if let match = MyRegex.firstMatch(in: str, range: NSMakeRange(0, str.count)) {
     let groups = match.groups(testedString: str)
     print(groups)
}
// => ["typedef: struct { something } text;", " something ", "text"]

暫無
暫無

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

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