【问题标题】:Extract emoji (unicode) from NSString [duplicate]从NSString中提取表情符号(unicode)[重复]
【发布时间】:2016-12-31 12:15:52
【问题描述】:

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

我找不到任何好的解决方案。

假设我有这个字符串:

" xxx ???????? sss ????"

如何获得这 2 个表情符号?

请注意:“???????? == ???? + ????(表情符号修饰符 Fitzpatrick Type-6)”

【问题讨论】:

标签: objective-c swift unicode emoji


【解决方案1】:

此代码仅在最新的 iOS 10 SDK 中有效,无法检测到某些组合的表情符号,但如果您觉得可以,请尝试:

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 的代码。)您可能需要修改模式。

【讨论】:

  • 我需要 iOS 9 支持。
  • @RedMak,已更新,请尝试。
猜你喜欢
  • 2021-10-02
  • 2016-05-26
  • 2016-11-06
  • 2016-11-02
  • 2021-07-24
  • 2021-03-11
  • 1970-01-01
  • 2019-07-11
  • 1970-01-01
相关资源
最近更新 更多