我有一个充满消息的数据库,我正在尝试查看每个用户最常用的表情符号。
我发现了this regex,这是“受lodash’s implementation of split.启发的”
let regex = new RegExp([
'(?:[\\u2700-\\u27bf]|(?:\\ud83c[\\udde6-\\uddff]){2}|',
'[\\ud800-\\udbff][\\udc00-\\udfff]|[\\u0023-\\u0039]\\ufe0f?\\u20e3|',
'\\u3299|\\u3297|\\u303d|\\u3030|\\u24c2|\\ud83c[\\udd70-\\udd71]|',
'\\ud83c[\\udd7e-\\udd7f]|\\ud83c\\udd8e|\\ud83c[\\udd91-\\udd9a]|',
'\\ud83c[\\udde6-\\uddff]|[\\ud83c[\\ude01-\\ude02]|\\ud83c\\ude1a|',
'\\ud83c\\ude2f|[\\ud83c[\\ude32-\\ude3a]|[\\ud83c[\\ude50-\\ude51]|',
'\\u203c|\\u2049|[\\u25aa-\\u25ab]|\\u25b6|\\u25c0|[\\u25fb-\\u25fe]|',
'\\u00a9|\\u00ae|\\u2122|\\u2139|\\ud83c\\udc04|[\\u2600-\\u26FF]|',
'\\u2b05|\\u2b06|\\u2b07|\\u2b1b|\\u2b1c|\\u2b50|\\u2b55|\\u231a|',
'\\u231b|\\u2328|\\u23cf|[\\u23e9-\\u23f3]|[\\u23f8-\\u23fa]|\\ud83c\\udccf|\\u2934|\\u2935|[\\u2190-\\u21ff])'
].join(''), 'g')
所以我使用以下查询提取消息:
alltext_query = "select sender, mtext from Messages;"
并像这样解析每个消息:
pool.query(alltext_query, (err, result) => {
if(err) {
console.error(err)
} else {
result.rows.forEach(row => {
console.log(row['mtext'].match(regex))
})
}
})
这给了我这样的输出:
[ '?', '?', '?' ]
[ '?' ]
[ '?', '?', '?', '?', '?', '?' ]
[ '?', '?' ]
[ '?', '?' ]
null # if there's no emoji in the message
这非常适合查找最常用的表情符号。但是,对于具有肤色和/或性别的表情符号,输出将如下所示:
[ '?', '?', '?', '♀' ]
[ '?', '♂' ]
[ '?', '?', '?', '?', '?', '?' ]
如您所见,肤色和性别已经分开,这是不希望的。
对于以上三个数组,我期望输出如下:
[ '?', '??♀️' ]
[ '?♂️' ]
[ '??', '??', '??' ]
我该如何解决?
答案 0 :(得分:1)
有一个名为Emoji Test Patterns的Node模块,它基于emoji-test.txt数据文件构建表情符号正则表达式模式。您可以尝试一下,看看它是否满足您的需求。
类似的事情可能会起作用:
const emojiTestPatterns = require ('emoji-test-patterns');
let regex = new RegExp (emojiTestPatterns["Emoji_Test_All"], 'gu');
// [...]
console.log(row['mtext'].match(regex));