众所周知,表情符号最多编码为 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('[uD83DuDE01-uD83DuDE4F]', '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
}));
斯菲德尔
我真的不想暴力破解字符串以查找我的范围内的字符序列。有人可以帮助我找到使用正则表达式的方法吗?
编辑刚刚想出了一个枚举所有表情符号的想法。比蛮力更好,但仍在寻找更好的主意
var reg = XRegExp('uD83DuDE01|uD83DuDE4F|...','g');
u....
表示法有四个十六进制数字,不多不少,所以它只能表示最多 U+FFFF 的代码点。上述表示为代理项代码点对的 Unicode 字符。
因此,需要一些间接的方法。 参见 BMP 之外的 JavaScript 字符串。
例如,您可以在范围[uD800-uDBFF]
(高代理项)中查找代码点,当您找到一个时,请检查字符串中的下一个代码点是否在[uDC00-uDFFF]
范围内(如果不是,则存在严重的数据错误),将两者解释为 Unicode 字符,并将它们替换为您希望放置的任何内容。这看起来像是通过字符串进行简单循环的工作,而不是正则表达式。
这有点旧了,但我正在研究这个问题,似乎布拉德利·蒙伯格在这里发布了一个很好的解决方案: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-uDBFFuDC00-uDFFF]+/
要匹配所有匹配,请使用 g 修饰符:
/[uD83C-uDBFFuDC00-uDFFF]+/g
第二次编辑:正如CodeToad正确指出的那样,上面的正则表达式无法识别,✨因为它在dingbats块中(感谢air_hadoken)。
lodash 库想出了一个优秀的表情符号正则表达式块:
(?:[u2700-u27bf]|(?:ud83c[udde6-uddff]){2}|[ud800-udbff][udc00-udfff])[ufe0eufe0f]?(?:[u0300-u036fufe20-ufe23u20d0-u20f0]|ud83c[udffb-udfff])?(?:u200d(?:[^ud800-udfff]|(?:ud83c[udde6-uddff]){2}|[ud800-udbff][udc00-udfff])[ufe0eufe0f]?(?:[u0300-u036fufe20-ufe23u20d0-u20f0]|ud83c[udffb-udfff])?)*
凯文·斯科特(Kevin Scott)很好地整理了一下,这个正则表达式在他的博客文章中涵盖了什么。 剧透:它包括丁蝙蝠
也许你可以看看这篇文章:http://crocodillon.com/blog/parsing-emoji-unicode-in-javascript
从u1F601
到u1F64F
的表情符号Unicode
翻译成JavaScript的UTF-16ud83dude00
ud83dude4f
第一个字符总是ud83d
.
所以注册出来了:
/ud83d[ude00-ude4f]/g
希望这可以有所帮助
- /\ud83d[\ude00-\ude4f]/g
不包括所有表情符号,例如:,请参阅 http://getemoji.com/并尝试您的正则表达式 https://regex101.com/
- /
- [\uD83C-\uDBFF\uDC00-\uDFFF]+/g
不包括所有表情符号,例如: ⛑ ☕️ ☁️☄️ ☀️☃️ ⛄️ ❄️ ☹️☺️⛩⛱™️ ©️ ®️ 〰️ ➰ ➿
- 即使这个正则表达式也不允许您删除所有表情符号... :
https://github.com/nizaroni/emoji-strip/blob/master/dist/emoji-strip.js#L79
然后,你能说出为什么你认为这些正则表达式不好删除所有异国情调的字符和表情符号吗?
/[u1000-uFFFF]+/g
要删除所有可能的表情符号:
new RegExp('[u1000-uFFFF]+', 'g');
下面的正则表达式模式在java中对我有用。
"[ud83cudc00-ud83cudfff]|[ud83dudc00-ud83dudfff]|[u2600-u27ff]"
由于 java 字符串使用 UTF-16 编码,并且表情符号也高于0xFFFF,因此此正则表达式模式考虑代理项对来识别表情符号。
为了好玩:在不使用正则表达式的情况下删除特殊字符的解决方案
const str = "abcdefgehijkz Раз, два три! 1234567809 -ab A Z & é è Ö â ☺️ ☹️ -axxb-"
/********* with regExp ***********/
let startTime = new Date().getTime();
let resp = str.replace(new RegExp('[u00FF-uFFFF]+','g'), '');
console.log(resp);
console.log(new Date().getTime() - startTime);
/********* without regExp ***********/
startTime = new Date().getTime();
resp = Array.from(str, x => {
let theUnicode = x.charCodeAt(0).toString(16);
while (theUnicode.length < 4) {
theUnicode = '0' + theUnicode;
}
if (theUnicode < '00ff') {
return x;
}
}).join('');
console.log(resp);
console.log(new Date().getTime() - startTime);
表情符号在 U+1F600 到 U+1F64F 的范围内
您可以在脚本中使用此行与 JSON 一起发送:
text.replace(/[u1F60-u1F64]|[u2702-u27B0]|[u1F68-u1F6C]|[u1F30-u1F70]{u2600-u26ff]/g, "");
也许你应该以这种方式使用替换?
reg = str.replace(new RegExp(' ','g'),'');
试用 https://github.com/iLeonidze/emoji.js