正则表达式查找和替换冒号内的表情符号名称

Regex to find and replace emoji names within colons

我正在尝试编写一个正则表达式(用于 JavaScript 的正则表达式引擎),我可以使用它在文本中查找和替换冒号内的表情符号名称。就像在 Slack 或 Discord 中,当您键入 :smiley-face: 并在您提交聊天时它会替换它。我只针对文本节点,所以我不需要担心文本中的其他 html。

是否可以编写一个可以匹配以下所有规则的正则表达式? (用等宽块突出显示的文本 = 正则表达式匹配)

:any-non-whitespace:
:text1:样本 2:
:@(1@#$@SD::s:
:nospace::inbetween:因为中间有2个冒号
:nospace:中间:nospace:

我从类似这样的东西开始,但它不完整

/:(?!:)\S+:/gim

我正在尝试考虑执行此操作可能发生的所有特殊情况。可能是我多虑了。

涉及很多 Twitch 表情,所以我不能使用表情符号 unicode 字符。正则表达式将找到匹配项并替换为标签

我第一个想到的是

:(::|[^:\n])+:

它匹配一个字符串,至少一个字符长,包括周围的冒号,由

  • 两个冒号(::),或
  • 不是冒号也不是换行符的字符。

但这基本上就是 Wiktor 作为(较慢的)替代品(评论)所拥有的。但无论如何我都会把它留在这里,因为它正在工作,而不是其他提交的答案 ;)

See it here at regex101.

你想要这样的正则表达式吗?

(:(?![\n])[()#$@-\w]+:)

Demo, 其中可以在(?![\n])的字符class中追加插入unallowed characters,在(?![\n])中追加插入allowed characters字符 class [()#$@-\w]

我建议使用

:[^:\s]*(?:::[^:\s]*)*:

参见regex demo. It is the same pattern as :(?:[^:\s]|::)*:, but a bit more efficient because the (?:..|...)* part is

详情

  • : - 冒号
  • [^:\s]* - : 和空格
  • 以外的 0+ 个字符
  • (?: - 量化 non-capturing 组的开始:
    • :: - 双冒号
    • [^:\s]* - : 和空格
    • 以外的 0+ 个字符
  • )* - 分组结束,重复 0 次或多次(由于 * 量词)
  • : - 一个冒号。

试试这个正则表达式

/(^|\s)+:([^\s\n\r])+:|^:[^\s\n\r]+/g