2016-04-28 17 views
1

私は文字列内のURLを検出し、見つけられるURLと範囲の両方を返すメソッドを持っています。文字列に絵文字があるまで、すべてが完全に機能します。たとえば、次の理由絵文字のSwift - 文字列中の絵文字を空白に置き換える

"I'm gonna do this callenge as soon as I can swing again \n http://youtu.be/SW_d3fGz1hk" 

、テキストから抽出されたURLはhttp://youtu.be/SW_d3fGz1の代わりhttp://youtu.be/SW_d3fGz1hkです。私は、最も簡単な解決策は、文字列のemojisを空白文字で置き換えることだと考えました。問題は、これはSwiftで達成するのが非常に難しいことです(Swift String APIを使用した私の能力は不足している可能性が高いです)。

私はこのようにそれをやろうとしてきたが、私はユニコード点の配列から文字列を作成することができないようです。

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) 
} 

私はこの問題に間違った方法に近づいているだろうか? emojisをここで最高のソリューションに置き換えていますか?もしそうなら、どうしたらいいですか?

答えて

4

絵文字用のパターンマッチングを使用して、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アレイ。


私はあなたが(上記のフィルタリングソリューションがん)空白文字と絵文字を代入するのではなく、それらを取り除く好むことをもう一度、あなたの質問を読ん実現。私たちはずっとあなたの質問

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) } 
    } 
} 

のようにI以上、既存の絵文字の間隔がこの投稿へのコメント(につきとして、拡張されている、代わりに条件付きの復帰.map操作して上に.filter操作を置き換えることによって、これを達成することができますこれらの間隔をリストしている)、その結果、絵文字チェックが網羅的である可能性がある。

+0

ほぼ! "Svsbsvs shsbsv \ nhttp://m.youtube.com/watch?v = H6_zvQQ5P8w" \tという文字列は、 "Svsbsvs shsbsv \ nhttp://m.youtube.com/watch?v = H6_zvQQ5P8w" – Raphael

+0

という文字列が表示されます。私はいくつかの範囲を行方不明になった: らemojiPatterns = [UnicodeScalar(0x1F600)... UnicodeScalar(0x1F64F)、 UnicodeScalar(0x1F300)... UnicodeScalar(0x1F5FF)、 UnicodeScalar(0x1F680)... UnicodeScalar(0x1F6FF)、 UnicodeScalar(0x26FF)、 UnicodeScalar(0x2700)... UnicodeScalar(0x27BF)、 UnicodeScalar(0xFE00)... UnicodeScalar(0xFE0F) – Raphael

+0

ああ、私は私の答えに含めるべきだった私は単純にあなたの質問から絵文字の範囲を適用し、私の答えでこれらを使用するための技術を説明していますが、範囲が網羅的かどうかを決して知ることはできません!あなたの編集をありがとう! – dfri

関連する問題