所有Discord标签类型的正则表达式模式

时间:2018-07-25 12:56:08

标签: javascript regex discord.js

做一些discord.js机器人程序开发,我正在尝试创建一个正则表达式,该过滤器将过滤掉所有类型的discord标记(也称为标记用户和自定义表情)。我尝试了几种不同的方法,但是没有一种方法可以捕获所有情况。标签的5种主要样式是:

<@108012418998792192> (User)
<@!420279649055145996> (User)
<:oof:463391326491377674> (Emote without number in name)
<:Tyler1:311344841466576896> (Emote with number in name)
<:1234:123412314353463456> (Emote that just has number in name)

我遇到的主要问题之一是标签类型的多样性。如果您发现一个用户的开头有@!,而另一个用户的开头只有@。表情符号与:ALPHA_NUMERIC:开头的故事完全不同。

此bot过滤了很多消息,因此,我试图使其尽可能高效和紧凑。

我尝试做类似的事情

arg.replace(/<\D+\d+>/g, '').trim();
arg.replace(/<\D+\w+>/g, '').trim();

但是它无法过滤掉最后2个。

3 个答案:

答案 0 :(得分:2)

Looks like (regexr.com link)

<((@!?\d+)|(:.+?:\d+))>

应该可以解决问题。

答案 1 :(得分:1)

我建议使用

/<(?:[^\d>]+|:[A-Za-z0-9]+:)\w+>/g

请参见regex demo。我对\D速记类进行了说明,以确保它永远不会在>右边界上出现过度匹配。

详细信息

  • <-一个<字符
  • (?:[^\d>]+|:[A-Za-z0-9]+:)-以下任一项
    • [^\d>]+-除数字和>之外的1个或更多字符
    • |-或
    • :-冒号,
    • [A-Za-z0-9]+-1个或多个字母或/和数字
    • :-冒号
  • \w+-1个或多个字母,数字或_(用[A-Za-z0-9][^\W_]替换以排除下划线)
  • >-一个>字符。

答案 2 :(得分:0)

要撞这个。 AKX 的回答适用于静态表情符号、用户提及。

您的 OP 只说明了这两个,但说明“过滤掉所有类型的不和谐标签” 一个简单的技巧还将涵盖角色提及,其中&符号跟在@:<@&ID> 和动画表情符号,遵循以下约定:

为了减少角色提及, 在 &?

之后添加 !?

为了减少动画表情符号, 在第二次前瞻中的第一个冒号前添加 a?

/<((@!?&?\d+)|(a?:.+?:\d+))>/g