3

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

我见过这个相关的问题,但它似乎与我的不同。

所以我需要返回表情符号名称或: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::- 仅当它们之间没有空格时。(注意 和 之间的:smile:空格:skin-tone-6:

条件:

它应该只匹配:code::skintone:if skintone is 2-6

如果我这样做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:
4

1 回答 1

1

您可以String#split()使用

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

正则表达式。请参阅正则表达式演示

细节

  • :- 一个冒号
  • [^\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; }).

于 2018-07-13T12:39:38.670 回答