Javascript 单词边界对符号字符有效吗?

Javascript 单词边界对符号字符有效吗?,javascript,regex,word-boundary,Javascript,Regex,Word Boundary,我正在尝试在聊天的表情符号功能中实现单词边界。但出于某种原因,我似乎无法让“边界”这个词起作用。我对regex不熟悉 因此,当我这样做时: var reg = /\b\Hi\b/gi; var str = 'HiHiHi Hi HiHiHi Hi'; alert(str.replace(reg, '')); 发生这种情况: 它实际上工作得很好,并且确实移除了两个独立的Hi 但当我将注册表更改为转义笑脸,然后更改字符串时: var reg = /\b\:\)\b/gi; var str = 'H

我正在尝试在聊天的表情符号功能中实现单词边界。但出于某种原因,我似乎无法让“边界”这个词起作用。我对regex不熟悉

因此,当我这样做时:

var reg = /\b\Hi\b/gi;
var str = 'HiHiHi Hi HiHiHi Hi';
alert(str.replace(reg, ''));
发生这种情况:

它实际上工作得很好,并且确实移除了两个独立的Hi

但当我将注册表更改为转义笑脸,然后更改字符串时:

var reg = /\b\:\)\b/gi;
var str = 'HiHi:) :) HiHiHi :)';
alert(str.replace(reg, ''));
发生这种情况:


它就是不起作用。字符串保持不变。是不是单词边界不能用在符号上?如果是这样,Facebook是如何在他们的聊天中做到这一点的?

单词边界
\b
表示单词字符
\w
(在javascript中,
[a-Za-z]
)和非单词字符
\w
(其他所有字符)之间的零宽度边界

因此,两个表情符号之间不会有边界,或者当表情符号被空格、标点符号等包围时也不会有边界

最简单的正则表达式是
/[:;]-?[()]/gi
,它支持微笑
和皱眉
带有可选的破折号和眼睛
或眨眼

编辑:

这将需要一个空格或字符串的开头(作为一个捕获组,因为Javascript不支持look behinds),然后它使用上面的正则表达式,然后它必须后跟字符串的结尾或空格

var reg = /(\s|^)[:;]-?[()](?:\s|$)/gi;
var str = 'HiHi:) :) HiHiHi :)';
alert(str.replace(reg, '$1'));
在这些情况下应更换:
:-)
酷:(不!


在这些情况下不应替换:
数字:(0,1,2,3)
高:(.

因为
\b
在这种情况下不起作用,您可以使用:

var re = /(\s|^):\)(?!\S)/g;
var str = 'HiHi:) :) HiHiHi :)';
alert(str.replace(re, '$1'));
就像一个空间边界

您可以添加几个笑脸,如下所示:

/(\s|^)(?::\)|:\(|:\||:\]|:\[)(?!\S)/g;

或者更简单地说:
\w
\w
。虽然Javascript只使用ASCII,但一般来说,许多正则表达式引擎的
\w
类要大得多。因此,我无法使用单词边界来实现这一点:/我不确定您试图实现什么。您可以尝试
\B
,看看这是否对您有所改善,但我不知道我想它会的。请添加一些你不想匹配的例子。我只想让它匹配独立微笑,例如当有人在聊天时,写下:“嗨:)“the::”在这种情况下不会变成微笑。但如果你有:“嗨:)”请添加一些你所做和不想匹配的示例。你所说的“Facebook是如何做到的…”是什么意思?@Shawn31313,请参阅更新。别忘了转义元字符。好的。现在,我如何在新的RegExp()javascript对象中添加上面的reg?@Shawn31313,修复语法错误,并在引用时双重转义反斜杠:是的,哈哈,我刚刚意识到,所以我删除了注释。