我正在努力用正則運算式修改捕獲的值。
例如,我想改變"Hello, he is hero",以"HEllo, HE is HEro"使用正則運算式。
我知道有很多方法可以在沒有正則運算式的情況下改變這一點,但這只是說明問題的一個例子。我實際上使用正則運算式而不僅僅是he,但我不能在這里提供它。這就是為什么需要使用正則運算式。
下面的代碼不知何故不起作用。有什么方法可以使它作業嗎?
"Hello, he is hero".replacingOccurrences(
of: #"(he)"#,
with: "$1".uppercased(), // <- uppercased is not applied
options: .regularExpression
)
uj5u.com熱心網友回復:
您需要將正則運算式與 Range ( range(of:))結合使用來查找匹配項,然后分別替換每個找到的范圍
這是一個作為 String 擴展的函式,它通過使用range(of:)從字串的開頭開始,然后將開始索引從向前移動到最后一個匹配之后進行匹配。實際替換是在作為引數傳遞的單獨函式中完成的
extension String {
func replace(regex: String, with replace: (Substring) -> String) -> String {
var string = self
var startIndex = self.startIndex
let endIndex = self.endIndex
while let range = string.range(of: regex, options: [.regularExpression] , range: startIndex..<endIndex) {
string.replaceSubrange(range, with: replace(string[range]))
startIndex = range.upperBound
}
return string
}
}
我們對以“he”開頭的單詞進行不區分大小寫的搜索并將每個匹配替換為大寫版本的示例
let result = "Hello, he is hero. There he is".replace(regex: #"(?i)\bhe"#) {
$0.uppercased()
}
輸出
你好,他是 HEro。他在那
uj5u.com熱心網友回復:
你可以試試NSRegularExpression。就像是:
import Foundation
var sourceStr = "Hello, he is hero"
let regex = try! NSRegularExpression(pattern: "(he)")
let matches = regex.matches(in: sourceStr, range: NSRange(sourceStr.startIndex..., in: sourceStr))
regex.enumerateMatches(in: sourceStr, range: NSRange(sourceStr.startIndex..., in: sourceStr)) { (match, _, _) in
guard let match = match else { return }
guard let range = Range(match.range, in: sourceStr) else { return }
let sub = sourceStr.substring(with: range)
sourceStr = sourceStr.replacingOccurrences(of: sub, with: sub.uppercased(), options: [], range: range)
}
print(sourceStr)
uj5u.com熱心網友回復:
這是我可以提供的解決方案
var string = "Hello, he is hero"
let occurrence = "he"
string = string.lowercased().replacingOccurrences(
of: occurrence,
with: occurrence.uppercased(),
options: .regularExpression
)
print(string)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/344338.html
