Javascript 正则表达式匹配表情符号

Javascript 正则表达式匹配表情符号,javascript,regex,emoji,emoticons,Javascript,Regex,Emoji,Emoticons,我们正在进行一个项目,希望用户能够同时使用表情符号语法(如:微笑:,:心形:,:困惑:,:伸出舌头:),以及正常表情符号(如:),,,我想这些表情符号通常会与前后空格一起使用。然后,\s可能就是您要查找的内容,因为它代表一个空白 那么你的正则表达式就会变成 \s+(\:\)|\:\(|<3|\:\/|\:-\/|\:\||\:p)\s \s+(\:\)\:\(\制作一个 ([\:\match last separating space || |->匹配emot的最后一部分 ||->它可能

我们正在进行一个项目,希望用户能够同时使用表情符号语法(如
:微笑:
:心形:
:困惑:
:伸出舌头:
),以及正常表情符号(如
:)
,我想这些表情符号通常会与前后空格一起使用。然后,
\s
可能就是您要查找的内容,因为它代表一个空白

那么你的正则表达式就会变成

\s+(\:\)|\:\(|<3|\:\/|\:-\/|\:\||\:p)\s
\s+(\:\)\:\(\制作一个

([\:\match last separating space
|| |->匹配emot的最后一部分
||->它可能有一个“-”或没有
|->图释的第一部分
由于您使用的是javascript,并且您无权查看:

/([\:\<]-?[)|\\/pP3D])(\s|$)/g.exec('hi :) ;D');
/([\:\首先匹配表情符号(处理:铅笔:示例),然后检查是否有终止的空格或换行符:

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

(\:\w+\:\124;\您需要正则表达式查看有关间距的情况。这里的另一个答案建议积极展望未来,尽管我会选择双重否定:

(?<!\S)(\:\)|\:\(|<3|\:\/|\:-\/|\:\||\:p)(?!\S)
(?
虽然JavaScript不支持
(?,:

test\u string.replace(/(\S)?(\:\)\:\(\;(?!\S)
在后面。前缀确保您不跟随非空白字符,因此唯一有效的前导项是空格或空白(行首)。后缀做同样的事情,确保您不跟随非空白字符。另请参见此


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

为什么不将其拆分为多个正则表达式?另外,您可以做的是匹配边界,例如
/\B:\)\b/
如果我没记错的话,两者都提供了JS代码来实现它们的图像集,在Github、NPM、bower等平台上有几十个相同的实现。我使用的是JavaScript,JS中不支持lookbehind:(@ChrisBarr啊,说得好。使用替换调用的函数解决了问题。请参阅我刚才所做的编辑。是的!我已经有了表情符号选择,但这里的关键是在我现有正则表达式的末尾添加
(?=\s |[\!\,\?]\$)
。谢谢!匹配
您还应该检查它是否不是一组有效的括号的一部分,例如,您不希望它与
8)
此处的表情相匹配:
blah blah bug(在iOS 8上重现)
。简而言之,这确实不是您可以用正则表达式很好地处理的。它看起来像任何后跟
的字符也匹配(
A:
~:
H:
,等等)。不要认为这就是你想要的。在一组重复的表情符号中,除了最后一个之外,也会遗漏所有表情(
(:(:
):)
)。
(\:\w+\:|\<[\/\\]?3|[\(\)\\\D|\*\$][\-\^]?[\:\;\=]|[\:\;\=B8][\-\^]?[3DOPp\@\$\*\\\)\(\/\|])(?=\s|[\!\.\?]|$)
:( :) :P :p :O :3 :| :/ :\ :$ :* :@
:-( :-) :-P :-p :-O :-3 :-| :-/ :-\ :-$ :-* :-@
:^( :^) :^P :^p :^O :^3 :^| :^/ :^\ :^$ :^* :^@
): (: $: *:
)-: (-: $-: *-:
)^: (^: $^: *^:
<3 </3 <\3
:smile: :hug: :pencil:
(?<!\S)(\:\)|\:\(|<3|\:\/|\:-\/|\:\||\:p)(?!\S)
test_string.replace(/(\S)?(\:\)|\:\(|<3|\:\/|\:-\/|\:\||\:p)(?!\S)/,
                    function($0, $1) { return $1 ? $0 : replacement_text; });