我们正在开展一个项目,我们希望用户能够同时使用表情符号语法(如:smile:
,:heart:
,:confused:
,:stuck_out_tongue:
)以及普通表情符号(例如:)
,<3
,:/
,:p
)
我的表情符号语法有问题,因为有时这些字符序列会出现在:
:/
/ example.com :p
encil: 如何找到这些表情字符序列,但是当其他字符靠近它们时却不能找到它们?
我用于所有表情符号的整个正则表达式都是巨大的,所以这里是一个简化版本:
(\:\)|\:\(|<3|\:\/|\:-\/|\:\||\:p)
您可以在此处演示它的演示:http://regexr.com/3a8o5
答案 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
。这是更便携的(它几乎适用于所有正则表达式解析器,而环顾四周没有),你可以选择它,但我更喜欢环顾四周。