matchesInString()
메소드가 String
첫 번째 인수로 a 를 사용 하더라도 내부적으로로 작동 NSString
하며 range 매개 변수는 NSString
Swift 문자열 길이가 아닌 길이를 사용하여 제공되어야합니다 . 그렇지 않으면 "플래그"와 같은 "확장 grapheme 클러스터"에 대해 실패합니다.
현재 스위프트 4 (엑스 코드 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의 코드는 편집 기록에서 찾을 수 있습니다.
스위프트 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"]
스위프트 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"]