Ngay cả khi matchesInString()
phương thức lấy tham String
số làm đối số đầu tiên, nó vẫn hoạt động bên trong NSString
và 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 NSString
và 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"]