【发布时间】:2018-09-08 18:15:16
【问题描述】:
let regex1 = "(\\ud83d\\udc68)"
let regex2 = "(\\ud83d[\\udc68-\\udc69])"
"????".capturedGroupsFull(forRegex: regex1)
// returns 1 match: [(.0 "????", .1 {0, 2})]
"????".capturedGroupsFull(forRegex: regex2)
// returns nil
为什么第一行返回一个匹配而第二行不匹配?
- 两个正则表达式都可以在 regex101 上正常工作(例如,设置为
javascript 并使用第二个正则表达式作为
(\ud83d[\udc68-\udc69]))。 - 我是 使用 Swift 4.0。
- 这个正则表达式
"(\\ud83d[\\udc68])"也将 在 Playground 中测试时返回nil。
您可以在下面找到我用来检索匹配项的完整代码。
extension String {
func capturedGroupsFull(forRegex regex: String) -> [(String, NSRange)]? {
let expression: NSRegularExpression
do {
expression = try NSRegularExpression(pattern: regex, options: [.caseInsensitive])
} catch {
return nil
}
let nsString = self as NSString
let matches = expression.matches(in: self, options: [], range: NSRange(location:0, length: nsString.length))
guard let match = matches.first else { return nil }
var results = [(String, NSRange)]()
for match in matches {
let range = match.range
let matchedString = nsString.substring(with: range)
results.append((matchedString, range))
}
return results
}
}
【问题讨论】:
-
您可以链接 regex101 btw。只需点击分享正则表达式
-
@chrisz 谢谢,更新了链接。你知道为什么它不能使用我的代码吗?
-
哪个版本的 Swift?
-
@chrisz swift 4.0
-
原因可能是 NSRegularExpression 在 Unicode 标量而不是 UTF-16 代码单元上运行。使用
regex2 = "([\\ud83d\\udc68-\\ud83d\\udc69])",您将获得预期的结果。
标签: swift regex unicode emoji nsregularexpression