做一些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个。
答案 0 :(得分:2)
答案 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