web-dev-qa-db-ja.com

JavaScriptの正規表現を使用して絵文字のUnicodeシンボルを置き換える

ご存じのとおり emoji 記号は3バイトまたは4バイトまでコード化されているため、文字列内で2つの記号を占める場合があります。たとえば、 '???? wew ????'。length = 7テキスト内でこれらの記号を見つけて、コードに依存する値に置き換えたいと思います。 SOを読んで、Unicodeプラグインを備えたXRegExpライブラリを思いつきましたが、それを動作させる方法が見つかりませんでした。

var str = '????wew????';// \u1F601 symbol
var reg = XRegExp('[\u1F601-\u1F64F]', 'g'); //  /[ὠ1-ὤF]/g -doesn't make a lot of sense  
//var reg = XRegExp('[\uD83D\uDE01-\uD83D\uDE4F]', 'g'); //Range out of order in character class
//var reg = XRegExp('\\p{L}', 'g'); //doesn't match my symbols
console.log(XRegExp.replace(str, reg, function(match){
   return encodeURIComponent(match);// here I want to have smth like that %F0%9F%98%84 to be able to map anything I want to this value and replace to it
}));

jsfiddle

私の範囲から文字のシーケンスを探す文字列をブルートフォースで強制したくありません。誰かが正規表現でそれを行う方法を見つけるのを手伝ってくれませんか?.

[〜#〜] edited [〜#〜]すべてを列挙するアイデアが思いついた絵文字シンボル。ブルートフォースより優れているが、より良いアイデアを探している

var reg = XRegExp('\uD83D\uDE01|\uD83D\uDE4F|...','g');
11

\u....表記には4桁の16進数があり、それ以上でもそれ以下でもないため、U + FFFFまでのコードポイントしか表すことができません。上記のUnicode文字は、代理コードポイントのペアとして表されます。

したがって、いくつかの間接的なアプローチが必要です。 Cf. to BMP外のJavaScript文字列

たとえば、[\uD800-\uDBFF](サロゲート)の範囲でコードポイントを検索し、コードポイントが見つかったら、文字列内の次のコードポイントが[\uDC00-\uDFFF]の範囲にあることを確認します(そうでない場合、重大なデータエラーが発生した場合)、この2つをUnicode文字として解釈し、そこに置きたいものに置き換えます。これは、正規表現ではなく、文字列の単純なループの仕事のように見えます。

12

これは少し古いですが、私はこの問題を調べていました bradley Mombergerがここに素晴らしい解決策を投稿したようです: http://airhadoken.github.io/2015/04/22/javascript-string-handling-emoji.html

彼が提案する正規表現は次のとおりです。

/[\uD800-\uDFFF]./ // This matches emoji

この正規表現は、絵文字で使用されるヘッドサロゲート、およびヘッドサロゲート(テールサロゲートと見なされます)に続く文字に一致します。したがって、すべての絵文字は正しく一致している必要があります

.replace(/[\uD800-\uDFFF]./g,'')

すべての絵文字を削除できるはずです。

編集:より良い正規表現が見つかりました。上記の正規表現はいくつかの絵文字を見逃しています。

しかし、私は絵文字を見つけることができないバージョンのreddit投稿があり、それはルールから除外されています。 redditはこちら: https://www.reddit.com/r/tasker/comments/4vhf2f/how_to_regex_emojis_in_tasker_for_search_match_or/ そして正規表現は:

/[\uD83C-\uDBFF\uDC00-\uDFFF]+/

すべての出現に一致させるには、g修飾子を使用します。

/[\uD83C-\uDBFF\uDC00-\uDFFF]+/g

2番目の編集:CodeToadが正しく指摘したように、✨はdingbatsブロックにあるため、上記の正規表現では認識されません(air_hadokenのおかげです)。

Lodashライブラリは優れた絵文字正規表現ブロックを思い付きました:

(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff])[\ufe0e\ufe0f]?(?:[\u0300-\u036f\ufe20-\ufe23\u20d0-\u20f0]|\ud83c[\udffb-\udfff])?(?:\u200d(?:[^\ud800-\udfff]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff])[\ufe0e\ufe0f]?(?:[\u0300-\u036f\ufe20-\ufe23\u20d0-\u20f0]|\ud83c[\udffb-\udfff])?)*

Kevin Scottがうまくまとめ、この正規表現が彼の Blog Post でカバーしているもの。スポイラー:絵文字が含まれています????

6

多分あなたはこの記事を見ることができます: http://crocodillon.com/blog/parsing-emoji-unicode-in-javascript

絵文字のユニコードを\u1F601から\u1F64F

javascriptのutf-16への変換は\ud83d\ude00から\ud83d\ude4f

最初の文字は常に\ud83dです。

だから、regは出ています:

/\ud83d[\ude00-\ude4f]/g

これが助けになることを願っています

6
shuizhongyuemin
  1. /\ud83d [\ ude00-\ude4f]/g

次のようなすべての絵文字を含まない:???? ???? ???? ???? ???? ???? ???? ????、 http://getemoji.com/ を参照して正規表現を試してください https://regex101.com/

  1. / [\ uD83C-\uDBFF\uDC00-\uDFFF] +/g

次のようなすべての絵文字は含まれません:⛑☕️☁️☄️☀️☃️⛄️❄️☹️☺️⛩⛱™️©️®️〰️➰➿

  1. この正規表現でも、すべての絵文字を削除することはできません... ???? ???? ???? ???? ???? ???? :

https://github.com/nizaroni/emoji-strip/blob/master/dist/emoji-strip.js#L79

次に、これらの正規表現がすべてのエキゾチックな文字と絵文字を削除するのに悪いと思う理由を教えていただけますか?

/[\u1000-\uFFFF]+/g
3

以下の正規表現パターンはJavaで私のために働いた。

"[\ud83c\udc00-\ud83c\udfff]|[\ud83d\udc00-\ud83d\udfff]|[\u2600-\u27ff]"

Java文字列はUTF-16エンコーディングを使用し、絵文字も0xFFFFを超えているため、この正規表現パターンは、絵文字を識別するためにサロゲートペアを検討します。

0
Ratnesh Thakur

可能なすべての絵文字を削除するには:

new RegExp('[\u1000-\uFFFF]+', 'g');
0