正则表达式匹配表情符号

时间:2015-01-21 21:21:02

标签: javascript regex emoji emoticons

我们正在开展一个项目,我们希望用户能够同时使用表情符号语法(如:smile::heart::confused::stuck_out_tongue:)以及普通表情符号(例如:)<3:/:p

我的表情符号语法有问题,因为有时这些字符序列会出现在:

  • 普通字符串或网址 - http :/ / example.com
  • 表情符号语法中的
  • - :p encil:

如何找到这些表情字符序列,但是当其他字符靠近它们时却不能找到它们?

我用于所有表情符号的整个正则表达式都是巨大的,所以这里是一个简化版本:

(\:\)|\:\(|<3|\:\/|\:-\/|\:\||\:p)

您可以在此处演示它的演示:http://regexr.com/3a8o5

4 个答案:

答案 0 :(得分:6)

首先匹配表情符号(照顾:pencil:示例),然后检查终止空格或换行符:

(\:\w+\:|\<[\/\\]?3|[\(\)\\\D|\*\$][\-\^]?[\:\;\=]|[\:\;\=B8][\-\^]?[3DOPp\@\$\*\\\)\(\/\|])(?=\s|[\!\.\?]|$)

此正则表达式匹配以下(首选表情符号)返回匹配组1中的匹配:

:( :) :P :p :O :3 :| :/ :\ :$ :* :@
:-( :-) :-P :-p :-O :-3 :-| :-/ :-\ :-$ :-* :-@
:^( :^) :^P :^p :^O :^3 :^| :^/ :^\ :^$ :^* :^@
): (: $: *:
)-: (-: $-: *-:
)^: (^: $^: *^:
<3 </3 <\3
:smile: :hug: :pencil:

除了空格外,它还支持终端标点符号作为分隔符。

您可以在此处查看更多详细信息并进行测试:https://regex101.com/r/aM3cU7/4

答案 1 :(得分:1)

我认为这些表情符号通常会在前后使用空格。那么\s可能就是你要找的东西,因为它代表了一个空白区域。

然后你的正则表达式会变成

\s+(\:\)|\:\(|<3|\:\/|\:-\/|\:\||\:p)\s

答案 2 :(得分:1)

制作positive look-ahead for a space

([\:\<]-?[)(|\\/pP3D])(?:(?=\s))
 |       |      |         |
 |       |      |         |
 |       |      |         |-> match last separating space
 |       |      |-> match last part of the emot
 |       |-> it may have a `-` or not 
 |-> first part of the emoticon

由于您使用的是javascript,而且无法环顾四周:

/([\:\<]-?[)|\\/pP3D])(\s|$)/g.exec('hi :) ;D');

然后只是splice()结果数组从最后一个条目中出来(最可能是一个空格)

答案 3 :(得分:0)

你想要有关间距的正则表达式。这里的另一个答案提出了积极的预测,尽管我会双重否定:

(?<!\S)(\:\)|\:\(|<3|\:\/|\:-\/|\:\||\:p)(?!\S)

虽然JavaScript不支持(?<!pattern)look-behind can be mimicked

test_string.replace(/(\S)?(\:\)|\:\(|<3|\:\/|\:-\/|\:\||\:p)(?!\S)/,
                    function($0, $1) { return $1 ? $0 : replacement_text; });

我所做的就是在代码前加(?<!\S)作为前缀,后缀为(?!\S)。前缀确保您不遵循非空白字符,因此唯一有效的前导条目是空格或空格(行首)。后缀执行相同的操作,确保您不会跟随非空白字符。另请参阅此more thorough regex walk-through

对问题本身的评论之一是建议\b(单词边界)标记。我不推荐这些。事实上,这个建议会与你想要的相反; \b:/确实会与http://匹配,因为p:之间存在单词边界。这种推理会建议\B(不是单词边界),例如\B:/\B。这是更便携的(它几乎适用于所有正则表达式解析器,而环顾四周没有),你可以选择它,但我更喜欢环顾四周。