แม้ว่าmatchesInString()
วิธีการที่ใช้String
เป็นอาร์กิวเมนต์แรกมันทำงานภายในด้วยNSString
และพารามิเตอร์ช่วงจะต้องได้รับการใช้NSString
ความยาวและไม่เป็นความยาวสตริง Swift มิฉะนั้นจะล้มเหลวสำหรับ "กลุ่มของกราฟที่ขยาย" เช่น "แฟล็ก"
ในฐานะของสวิฟท์ 4 (Xcode 9), ห้องสมุดมาตรฐานสวิฟท์ให้ฟังก์ชั่นการแปลงระหว่างและRange<String.Index>
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 []
}
}
ตัวอย่าง:
let string = "🇩🇪€4€9"
let matched = matches(for: "[0-9]", in: string)
print(matched)
// ["4", "9"]
หมายเหตุ:แกะบังคับให้Range($0.range, in: text)!
มีความปลอดภัยเพราะหมายถึงการย่อยของสตริงที่กำหนดNSRange
text
อย่างไรก็ตามหากคุณต้องการหลีกเลี่ยงก็ให้ใช้
return results.flatMap {
Range($0.range, in: text).map { String(text[$0]) }
}
แทน.
(คำตอบเก่าสำหรับ Swift 3 และรุ่นก่อนหน้านี้ :)
ดังนั้นคุณควรแปลงสตริง Swift ที่กำหนดเป็น NSString
แล้วแยกช่วง ผลลัพธ์จะถูกแปลงเป็นอาร์เรย์สตริง Swift โดยอัตโนมัติ
(รหัสสำหรับ Swift 1.2 สามารถพบได้ในประวัติการแก้ไข)
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 []
}
}
ตัวอย่าง:
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 []
}
}
ตัวอย่าง:
let string = "🇩🇪€4€9"
let matched = matches(for: "[0-9]", in: string)
print(matched)
// ["4", "9"]