Ngay cả khi matchesInString()phương thức lấy tham Stringsố làm đối số đầu tiên, nó vẫn hoạt động bên trong NSStringvà tham số phạm vi phải được cung cấp bằng cách sử dụng NSStringđộ dài và không phải là độ dài chuỗi Swift. Nếu không, nó sẽ thất bại đối với "cụm grapheme mở rộng" như "cờ".
Kể từ Swift 4 (Xcode 9), thư viện chuẩn Swift cung cấp các chức năng để chuyển đổi giữa Range<String.Index>
và 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 []
}
}
Thí dụ:
let string = "🇩🇪€4€9"
let matched = matches(for: "[0-9]", in: string)
print(matched)
// ["4", "9"]
Lưu ý: Unrap cưỡng bức Range($0.range, in: text)!là an toàn vì tham chiếu NSRangeđến một chuỗi con của chuỗi đã cho text. Tuy nhiên, nếu bạn muốn tránh nó thì hãy sử dụng
return results.flatMap {
Range($0.range, in: text).map { String(text[$0]) }
}
thay thế.
(Câu trả lời cũ hơn cho Swift 3 trở về trước :)
Vì vậy, bạn nên chuyển đổi chuỗi Swift đã cho thành một NSStringvà sau đó trích xuất các phạm vi. Kết quả sẽ được tự động chuyển thành mảng chuỗi Swift.
(Mã cho Swift 1.2 có thể được tìm thấy trong lịch sử chỉnh sửa.)
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 []
}
}
Thí dụ:
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 []
}
}
Thí dụ:
let string = "🇩🇪€4€9"
let matched = matches(for: "[0-9]", in: string)
print(matched)
// ["4", "9"]