正则表达式查找带有冒号和肤色的表情符号名称

Regex to find emoji names with colon and skintone

我正在为我的解析器使用 EmojiMart

我看过这个 但它似乎与我的不同。

所以我需要 return 表情符号名称或 :code: 以便他们能够对其进行解码。

例如我有这个文本:

:+1::skin-tone-6::man-pouting:Hello world:skin-tone- 
6:lalalalla:person_with_pouting_face: :poop::skin-tone-11: mamamia 
:smile: :skin-tone-6:

它应该匹配整个 :+1::skin-tone-6: 而不是单独的 :+1::skin-tone-6:: - 仅当它们之间没有 space 时。 (注意 :smile::skin-tone-6: 之间的 space )

条件:

如果肤色是 2-6

,它应该只匹配 :code::skintone:

如果我这样做 str.split(regex) 这是我的预期结果(数组):

- :+1::skin-tone-6:
- :man-pouting:
- Hello world
- :skin-tone-6:
- lalalalla
- :person_with_pouting_face: 
- :poop:
- :skin-tone-11: 
-  mamamia 
- :smile: 
- :skin-tone-6:

您可以将 String#split()

一起使用
/(:[^\s:]+(?:::skin-tone-[2-6])?:)/

正则表达式。见 regex demo.

详情

  • : - 冒号
  • [^\s:]+ - 除空格和 :
  • 以外的 1+ 个字符
  • (?:::skin-tone-[2-6])? - 一个可选的序列
    • ::skin-tone- - 文字子串
    • [2-6] - 从 26
    • 的数字
  • : - 一个冒号。

JS 演示:

var s = ":+1::skin-tone-6::man-pouting:Hello world:skin-tone-6:lalalalla:person_with_pouting_face: :poop::skin-tone-11: mamamia :smile: :skin-tone-6:";
var reg = /(:[^\s:]+(?:::skin-tone-[2-6])?:)/;
console.log(s.split(reg).filter(x => x.trim().length !=0 ));

.filter(x => x.trim().length !=0 ) 从生成的数组中删除所有空白项。对于 ES5 及更早版本,使用 .filter(function(x) { return x.trim().length != 0; }).