我有一个方法可以检测字符串中的网址,并同时返回网址和可以找到它们的范围。一切正常,直到字符串上有表情符号为止。例如:
"I'm gonna do this callenge as soon as I can swing again 😂😂😂\n http://youtu.be/SW_d3fGz1hk"
由于表情符号的原因,从文本中提取的网址是而不是//youtu.be/SW_d3fGz1hk)。我认为最简单的解决方案是用空格字符替换字符串上的表情符号(因为我需要该范围对于某些文本样式的东西来说是正确的)。问题是,使用Swift很难做到这一点(很可能我缺乏使用SwiftString API的能力)。
我一直在尝试这样做,但似乎无法从Unicode点数组创建字符串:
var emojilessStringWithSubstitution: String { let emojiRanges = [0x1F601...0x1F64F, 0x2702...0x27B0] let emojiSet = Set(emojiRanges.flatten()) let codePoints: [UnicodeScalar] = self.unicodeScalars.map { if emojiSet.contains(Int($0.value)) { return UnicodeScalar(32) } return $0 } return String(codePoints) }
我是否以错误的方式解决此问题?替换表情符号是这里最好的解决方案吗?如果是这样,我该怎么办?
您可以使用模式匹配(用于表情符号模式)从中过滤出表情符号字符String。
String
extension String { var emojilessStringWithSubstitution: String { let emojiPatterns = [UnicodeScalar(0x1F601)...UnicodeScalar(0x1F64F), UnicodeScalar(0x2702)...UnicodeScalar(0x27B0)] return self.unicodeScalars .filter { ucScalar in !(emojiPatterns.contains{ $0 ~= ucScalar }) } .reduce("") { $0 + String($1) } } } /* example usage */ let str = "I'm gonna do this callenge as soon as I can swing again 😂😂😂\n http://youtu.be/SW_d3fGz1hk" print(str.emojilessStringWithSubstitution) /* I'm gonna do this callenge as soon as I can swing again http://youtu.be/SW_d3fGz1hk */
请注意,以上方法仅使用了问题中显示的表情符号间隔,并不能代表所有表情符号,但是该方法是通用的,可以通过在emojiPatterns数组中包含其他表情符号间隔来快速扩展。
emojiPatterns
我意识到再次阅读您的问题是,您宁愿用空白字符代替表情符号,而不是删除它们(上述过滤解决方案可以做到)。我们可以通过将.filter上面的操作替换为有条件的返回.map操作来实现此目的,就像您的问题一样
.filter
.map
extension String { var emojilessStringWithSubstitution: String { let emojiPatterns = [UnicodeScalar(0x1F600)...UnicodeScalar(0x1F64F), UnicodeScalar(0x1F300)...UnicodeScalar(0x1F5FF), UnicodeScalar(0x1F680)...UnicodeScalar(0x1F6FF), UnicodeScalar(0x2600)...UnicodeScalar(0x26FF), UnicodeScalar(0x2700)...UnicodeScalar(0x27BF), UnicodeScalar(0xFE00)...UnicodeScalar(0xFE0F)] return self.unicodeScalars .map { ucScalar in emojiPatterns.contains{ $0 ~= ucScalar } ? UnicodeScalar(32) : ucScalar } .reduce("") { $0 + String($1) } } }
在上述情况下,根据您对此帖子的评论(列出了这些间隔),现有的表情符号间隔已得到扩展,因此表情符号检查现在可能会详尽无遗。