String Swift-用空格替换字符串中的表情符号

String Swift-用空格替换字符串中的表情符号,string,swift,unicode,emoji,String,Swift,Unicode,Emoji,我有一个方法可以检测字符串中的URL,并返回URL和可以找到它们的范围。在字符串上出现表情符号之前,一切都能正常工作。例如: "I'm gonna do this callenge as soon as I can swing again You can use pattern matching (for emoji patterns) to filter out emoji characters from your String. extension String { var em

我有一个方法可以检测字符串中的URL,并返回URL和可以找到它们的范围。在字符串上出现表情符号之前,一切都能正常工作。例如:

"I'm gonna do this callenge as soon as I can swing again You can use pattern matching (for emoji patterns) to filter out emoji characters from your 
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 Swift 4:

extension String {
  func stringByRemovingEmoji() -> String {
    return String(self.filter { !$0.isEmoji() })
  }
}

extension Character {
  fileprivate func isEmoji() -> Bool {
    return Character(UnicodeScalar(UInt32(0x1d000))!) <= self && self <= Character(UnicodeScalar(UInt32(0x1f77f))!)
      || Character(UnicodeScalar(UInt32(0x2100))!) <= self && self <= Character(UnicodeScalar(UInt32(0x26ff))!)
  }
}

“只要我能再次摆动,我就要执行此调用您可以使用模式匹配(用于表情符号模式)从您的
字符串中过滤出表情符号

var emojiString =  "Hey there I found that the solutions given above did not work for certain characters such as Getting all emoji is more complicated than you would think. For more info on how to figure out which characters are emoji, check out this stackoverflow post or this article.

Building on that information, I would propose to use the extension on Character to more easily let us understand which characters are emoji. Then add a String extension to easily replace found emoji with another character.

extension Character {
   var isSimpleEmoji: Bool {
      guard let firstProperties = unicodeScalars.first?.properties else {
        return false
      }
      return unicodeScalars.count == 1 &&
          (firstProperties.isEmojiPresentation ||
             firstProperties.generalCategory == .otherSymbol)
   }
   var isCombinedIntoEmoji: Bool {
      return unicodeScalars.count > 1 &&
             unicodeScalars.contains {
                $0.properties.isJoinControl ||
                $0.properties.isVariationSelector
             }
   }
   var isEmoji: Bool {
      return isSimpleEmoji || isCombinedIntoEmoji
   }
}

extension String {
    func replaceEmoji(with character: Character) -> String {
        return String(map { $0.isEmoji ? character : $0 })
    }
}
扩展字符串{
变量emojilesstringwithsubstitution:String{
设emojiPatterns=[UnicodeScalar(0x1F601)…UnicodeScalar(0x1F64F),
UnicodeScalar(0x2702)…UnicodeScalar(0x27B0)]
返回自我描述
.filter{ucScalar in!(emojiPatterns.contains{$0~=ucScalar})}
.reduce(“”{$0+字符串($1)}
}  
}
/*示例用法*/

let str=“我会在我能再次挥杆时立即做这个动作Swift 4:

扩展字符串{
func stringByRemovingEmoji()->字符串{
返回字符串(self.filter{!$0.isEmoji()})
}
}
扩展字符{
fileprivate func isEmoji()->Bool{

返回字符(UnicodeScalar(UInt32(0x1d000))!表情符号按Unicode分类为符号。字符集通常用于搜索操作。因此,我们将使用字符集作为符号的属性


var emojiString=“Hey there我发现上面给出的解决方案对某些字符不起作用,例如获取所有表情符号比你想象的要复杂。有关如何确定哪些字符是表情符号的更多信息,请查看此帖子或

基于这些信息,我建议使用字符扩展,让我们更容易理解哪些字符是表情符号。然后添加一个字符串扩展,以轻松地用另一个字符替换找到的表情符号

使用它只会变成:


“一些字符串Swift 5

不要使用这种
hardcoded
方式来检测
emojis
。在
Swift 5
中,您可以轻松地进行检测


let inputText=“Some几乎!字符串”Svsbsvs shsbsv找到了它。我缺少一些范围:et 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)啊,是的,我应该在我的回答中包括我只是应用了你问题中的表情范围,并在我的回答中解释了使用这些表情范围的技巧,但是我不知道这些范围是否详尽无遗!谢谢你的编辑!@dfri Swift 4.1
让表情模式=[UnicodeScalar(0x1F601)!…UnicodeScalar(0x1F64F)!,UnicodeScalar(0x2702)!…UnicodeScalar(0x27B0)!]
@LeoDabus谢谢!我尝试对上面的解决方案进行快速编辑,但在第二个块(
6
patterns)中的
emojiPatterns
遇到了“表达式太复杂”的问题。看起来很傻,几乎像一个回归,但如果我有时间的话,我会尝试重新分解成编译器可以处理的东西。如果你的应用程序支持iOS 10.0,这将不会有用。在iOS 14.0时代,哪些应用程序支持10.0!!