【问题标题】:Check for special characters in string检查字符串中的特殊字符
【发布时间】:2014-09-09 23:31:39
【问题描述】:

我目前正在为 Twitch 编写一个机器人。
现在我想检查每条消息是否有特殊字符,并检测包含超过 20% 特殊字符的消息。

消息本身是一个变量var msg,如果消息应包含超过 20% 的特殊字符,则应使用命令使用户超时。

这是它应该监听的事件:

event.on("chat", function(user, channel, message) {
        var msg = message.toLowerCase();
        var args = msg.split(" ");

        console.log("<"+user.color+" | "+user.username+" | "+user.special+"> <"+channel+"> "+message)
    });

希望任何人都可以帮助我。 这是我的第一个,或多或少,严肃的 JavaScript 项目。

【问题讨论】:

  • str.match(/\W/g).length / str.length * 100 |0
  • @elclanrs——如果没有 match 那么.length 会抛出一个错误。最好使用 split,它总是返回一个数组。
  • (str.match(/\W/g)||[]).length
  • match 返回 null 而不是空数组让我感到困惑,因为它是 split 的补充。我认为它值得 Brendan 回应:“我在 10 天内写了它……”。 ;-)
  • @elclanrs 为什么要创建新数组?

标签: javascript command character twitch


【解决方案1】:

tl;dr Jsfiddle

好吧,我不知道你怎么称呼一个特殊字符,但是让我们说它不是出现在普通文本中的东西:

//Regular expression that matches everything except specified
var regexp = /[^a-z0-9 ',\.:!\?]/ig;
//Get number of matches
var num_match = message.match(regexp);
num_match = num_match!=null?num_match.length:0;
//Percentage of unwanted characters:
var perctent_spec;
if(num_match!=null)
   perctent_spec = (num_match/message.length)*100; 
else 
   percent_spec = 0;

当然,你也可以循环遍历两个数组:

var chars = message.split("");
var allowed = ["a", "b", "c" ... ];
var count = 0;
for(var i=0,l=chars.length; i<l; i++) {
    count++;
    for(var j=0,l2 = allowed.length; j<l2; j++) {
        if(chars[i]==allowed[i]) {
          count--;
          break;
        }
    }
}

但我强烈怀疑循环方法会比正则表达式慢,后者立即使用内置函数。

【讨论】:

  • 谢谢,我尝试了第一个选项,但由于某种原因它不起作用。由于某些原因,我无法正确格式化代码。
  • 不要对性能做出假设。循环是高度优化的,所以可能会让你大吃一惊。将允许的字符指定为范围可能会更快,然后使用charCodeAt 来查看字符是否在范围内,因为它会删除一个循环。
  • 哦,如果没有匹配项,num_match 将为 null,因此您可以使用 if (!num_match) 甚至 percent_spec = num_match? num_match/message.length*100 : 0。 ;-)
  • @RobG 我希望代码尽可能详细。虽然!xx==null 返回false,但现在不是很明显,我们正在检查null。至于循环,我只是懒得在 jsperf 上检查它,所以我做了我的假设。
  • @Kazuto "Won't work" 是无用且空洞的句子。如果您需要帮助,您至少应该费心提供一些信息。
猜你喜欢
  • 2011-05-29
  • 2016-01-14
  • 2013-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-22
相关资源
最近更新 更多