首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从NSString中提取表情符号

从NSString中提取表情符号
EN

Stack Overflow用户
提问于 2016-08-24 11:23:31
回答 1查看 1.5K关注 0票数 2

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

我找不到好的解决办法。

假设我有一条绳子:

“xxx sss”

我怎么能得到这两个表情符号?

注意:“== + (Emoji修饰符Fitzpatrick Type-6)”

EN

回答 1

Stack Overflow用户

发布于 2016-08-24 11:46:14

此代码仅在最新的iOS 10 SDK中工作,无法检测到一些组合的表情符号,但如果可以,请尝试:

代码语言:javascript
复制
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  ")) //->["", ""]

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

代码语言:javascript
复制
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("ab‍❤️‍‍c")) //->["", "‍❤️‍‍", ""]

UPDATE2

一个在Swift 2/IOS9SDK中工作的示例。

代码语言:javascript
复制
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 = "ab‍❤️‍‍"

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39121989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档