从NSString中提取表情符号(Unicode) [英] Extract emoji (unicode) from NSString

查看:0
本文介绍了从NSString中提取表情符号(Unicode)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我必须分析一些字符串并提取表情符号。

我找不到好的解决方案来做这件事。

假设我有这个字符串:

"xxx👦🏿sss🤖"

如何获取这两个表情符号?

请注意:"👦🏿==👦+🏿(表情修饰符Fitzpatrick Type-6)"

推荐答案

此代码只能在最新的iOS 10SDK中运行,无法检测到一些组合的emoji,但如果您觉得可以,请尝试:

func emojis(_ str: String) -> [String]  {
    //You may need to add some extra characters as "Umbrella on ground" does not have property "Emoji_Presentation".
    let emojiPattern1 = "[\p{Emoji_Presentation}\u26F1]" //Code Points with default emoji representation
    let emojiPattern2 = "\p{Emoji}\uFE0F" //Characters with emoji variation selector
    let emojiPattern3 = "\p{Emoji_Modifier_Base}\p{Emoji_Modifier}" //Characters with emoji modifier
    let emojiPattern4 = "[\U0001F1E6-\U0001F1FF][\U0001F1E6-\U0001F1FF]" //2-letter flags
    let pattern = "(emojiPattern4)|(emojiPattern3)|(emojiPattern2)|(emojiPattern1)"
    let regex = try! NSRegularExpression(pattern: pattern, options: [])
    let matches = regex.matches(in: str, options: [], range: NSRange(0..<str.utf16.count))
    return matches.map{(str as NSString).substring(with: $0.range)}
}

print(emojis(" xxx 👦🏿 sss 🤖 ")) //->["👦🏿", "🤖"]

(更新)删除了上述代码中的一些错误。再试着检测一些组合的表情符号。

func emojisIncludingCombined(_ str: String) -> [String]  {
    //You may need to add some extra characters as "Umbrella on ground" does not have property "Emoji_Presentation".
    let emojiPattern1 = "[\p{Emoji_Presentation}\u26F1]" //Code Points with default emoji representation
    let emojiPattern2 = "\p{Emoji}\uFE0F" //Characters with emoji variation selector
    let emojiPattern3 = "\p{Emoji_Modifier_Base}\p{Emoji_Modifier}" //Characters with emoji modifier
    let emojiPattern4 = "[\U0001F1E6-\U0001F1FF][\U0001F1E6-\U0001F1FF]" //2-letter flags
    let pattern = "(emojiPattern4)|(emojiPattern3)|(emojiPattern2)|(emojiPattern1)"
    let combinedPattern = "(?:(pattern))(?:\u200D(?:(pattern)))*"
    let regex = try! NSRegularExpression(pattern: combinedPattern, options: [])
    let matches = regex.matches(in: str, options: [], range: NSRange(0..<str.utf16.count))
    return matches.map{(str as NSString).substring(with: $0.range)}
}
print(emojisIncludingCombined("a👍🏼b👨‍❤️‍💋‍👨c🇯🇵")) //->["👍🏼", "👨‍❤️‍💋‍👨", "🇯🇵"]

更新2

在Swift 2/iOS 9 SDK中运行的示例。

func emojis(str: String) -> [String]  {
    //You may need to add "refine" (or "tune") emojiPattern1...emojiPattern4.
    let emojiPattern1 = "[\u2600-\u27BF\U0001F300-\U0001F77F\U0001F900-\U0001F9FF]" //Code Points with default emoji representation
    let emojiPattern2 = "[\u2600-\u27BF\U0001F300-\U0001F77F\U0001F900–\U0001F9FF]\uFE0F" //Characters with emoji variation selector
    let emojiPattern3 = "[\u2600-\u27BF\U0001F300-\U0001F77F\U0001F900–\U0001F9FF][\U0001F3FB-\U0001F3FF]" //Characters with emoji modifier
    let emojiPattern4 = "[\U0001F1E6-\U0001F1FF][\U0001F1E6-\U0001F1FF]" //2-letter flags
    let pattern = "(emojiPattern4)|(emojiPattern3)|(emojiPattern2)|(emojiPattern1)"
    let regex = try! NSRegularExpression(pattern: pattern, options: [])
    let matches = regex.matchesInString(str, options: [], range: NSRange(0..<str.utf16.count))
    return matches.map{(str as NSString).substringWithRange($0.range)}
}

let str1 = "Hello, my name is Jason 😀 🐸 how are you ?"
let str4 = "I am going to the ⛱beach with some 🙉monkeys 👏"
let str5 = "🇯🇵Japan 👦🏻boy ♏️Scorpis" //="u{1F1EF}u{1F1F5}Japan u{1F466}u{1F3FB}boy u{264f}u{FE0F}Scorpis"
let str6 = " xxx 👦🏿 sss 🤖 "
let str7 = "a👍🏼b👨‍❤️‍💋‍👨"

print(emojis(str1)) //->["😀", "🐸"]
print(emojis(str4)) //->["⛱", "🙉", "👏"]
print(emojis(str5)) //->["🇯🇵", "👦🏻", "♏️"]
print(emojis(str6)) //->["👦🏿", "🤖"]
print(emojis(str7)) //->["👍🏼", "👨", "❤️", "💋", "👨"]

func emojisIncludingCombined(str: String) -> [String]  {
    //You may need to add "refine" (or "tune") emojiPattern1...emojiPattern4.
    let emojiPattern1 = "[\u2600-\u27BF\U0001F300-\U0001F77F\U0001F900-\U0001F9FF]" //Code Points with default emoji representation
    let emojiPattern2 = "[\u2600-\u27BF\U0001F300-\U0001F77F\U0001F900–\U0001F9FF]\uFE0F" //Characters with emoji variation selector
    let emojiPattern3 = "[\u2600-\u27BF\U0001F300-\U0001F77F\U0001F900–\U0001F9FF][\U0001F3FB-\U0001F3FF]" //Characters with emoji modifier
    let emojiPattern4 = "[\U0001F1E6-\U0001F1FF][\U0001F1E6-\U0001F1FF]" //2-letter flags
    let pattern = "(emojiPattern4)|(emojiPattern3)|(emojiPattern2)|(emojiPattern1)"
    let combinedPattern = "(?:(pattern))(?:\u200D(?:(pattern)))*"
    let regex = try! NSRegularExpression(pattern: combinedPattern, options: [])
    let matches = regex.matchesInString(str, options: [], range: NSRange(0..<str.utf16.count))
    return matches.map{(str as NSString).substringWithRange($0.range)}
}

print(emojisIncludingCombined(str7)) //->["👍🏼", "👨‍❤️‍💋‍👨"]
如代码中所述,emojiPattern1...emojiPattern4并不代表iOS中可用的完整表情符号集。(包括SWIFT 3的代码。)您可能需要修改图案。

这篇关于从NSString中提取表情符号(Unicode)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆