Sekalipun matchesInString()
metode tersebut menggunakan String
argumen pertama, ia bekerja secara internal NSString
, dan parameter rentang harus diberikan menggunakan NSString
panjang dan bukan sebagai panjang string Swift. Kalau tidak, itu akan gagal untuk "cluster grapheme diperpanjang" seperti "bendera".
Pada Swift 4 (Xcode 9), perpustakaan standar Swift menyediakan fungsi untuk mengkonversi antara Range<String.Index>
dan NSRange
.
func matches(for regex: String, in text: String) -> [String] {
do {
let regex = try NSRegularExpression(pattern: regex)
let results = regex.matches(in: text,
range: NSRange(text.startIndex..., in: text))
return results.map {
String(text[Range($0.range, in: text)!])
}
} catch let error {
print("invalid regex: \(error.localizedDescription)")
return []
}
}
Contoh:
let string = "🇩🇪€4€9"
let matched = matches(for: "[0-9]", in: string)
print(matched)
// ["4", "9"]
Catatan: Bukaan paksa Range($0.range, in: text)!
aman karena NSRange
mengacu pada substring dari string yang diberikan text
. Namun, jika Anda ingin menghindarinya maka gunakan
return results.flatMap {
Range($0.range, in: text).map { String(text[$0]) }
}
sebagai gantinya.
(Jawaban yang lebih lama untuk Swift 3 dan sebelumnya :)
Jadi, Anda harus mengubah string Swift yang diberikan ke NSString
dan kemudian mengekstrak rentang. Hasilnya akan dikonversi ke array string Swift secara otomatis.
(Kode untuk Swift 1.2 dapat ditemukan di riwayat edit.)
Swift 2 (Xcode 7.3.1):
func matchesForRegexInText(regex: String, text: String) -> [String] {
do {
let regex = try NSRegularExpression(pattern: regex, options: [])
let nsString = text as NSString
let results = regex.matchesInString(text,
options: [], range: NSMakeRange(0, nsString.length))
return results.map { nsString.substringWithRange($0.range)}
} catch let error as NSError {
print("invalid regex: \(error.localizedDescription)")
return []
}
}
Contoh:
let string = "🇩🇪€4€9"
let matches = matchesForRegexInText("[0-9]", text: string)
print(matches)
// ["4", "9"]
Swift 3 (Xcode 8)
func matches(for regex: String, in text: String) -> [String] {
do {
let regex = try NSRegularExpression(pattern: regex)
let nsString = text as NSString
let results = regex.matches(in: text, range: NSRange(location: 0, length: nsString.length))
return results.map { nsString.substring(with: $0.range)}
} catch let error {
print("invalid regex: \(error.localizedDescription)")
return []
}
}
Contoh:
let string = "🇩🇪€4€9"
let matched = matches(for: "[0-9]", in: string)
print(matched)
// ["4", "9"]