0

After looking here I came up with a patter to test an array of words against a string.

$.each(data, function(index, val) {
    var pattern = new RegExp('?:^|\s'+ val + '?=\s|$', 'g');
    console.log(pattern.test(comment));
    if (!pattern.test(comment)) {                           
           yay = true;
         }
});

the problem here is that it returns true all the time. Any suggestions? Thanks!

4

2 回答 2

1

修复这一行:

var pattern = new RegExp('(?:^|\s)'+ val + '(?=\s|$)', 'g');

您可能还会发现使用此在线实用程序调试/验证您的正则表达式很有用:

http://gskinner.com/RegExr/

您需要将val变量替换为示例值才能进行调试。

于 2013-05-13T21:28:41.990 回答
0

从您的 JsFiddle 中,我分叉并创建了自己的一个,一旦清除了所有小错别字,您的解决方案(使用评论中的正则表达式)效果很好。但是,它可能会更干净、更快速。这是我做的不同的事情:

$('#send-btn').on('click',function(){
    $('#error').hide();
    var pattern = new RegExp('\\b(' + list.join('|') + ')\\b', 'i');
    var comment = $('#comment').val();
    if(pattern.test(comment)){
        $('#error').show();
    };
});

具体来说,我生成的模式利用了 Javascript Array.join(内置 javascript),它将字符串数组与规定的间隙字符串粘贴在一起。这将构建一个字符串,其中所有搜索词都由正则表达式交流器 ( |) 附加。然后通过用括号包围该组以包含交替,我可以将单词边界正则表达式(\b)应用于任一端,以确保我们只匹配整个单词。g在其他新闻中:如果您只是做一个简单的测试,您真的不需要(global) 修饰符。您可能在其他应用程序中需要它 - 例如,如果您想突出显示有问题的单词 - 但为此我放弃了它。您应该将i修饰符用于不区分大小写的行为。

最大的好处是,如果你愿意,你可以选择在这个函数之外定义你的正则表达式,你会看到相当显着的速度提升。

缺点:随着你的脏话列表变长,收益会递减。但是考虑到这个基准,你的方法还需要一段时间才能变得更好(很长一段时间)。

笔记

你应该知道在正则表达式中使用它们之前应该转义你的单词 - 例如,在你的列表中,'ass' 将匹配 'alsls'。虽然这胡言乱语,但这并不是一个真正的脏话,您可以很容易地看到这样的问题如何可以推断为在没有亵渎的地方找到亵渎。但是,您可以选择在函数之外执行此操作,甚至可以在单词定义中利用正则表达式的强大功能(定义 '[a@][$s]{2}' 而不是 'ass'、'@ss'、 'a$s'、'as$'、'@$s'、'@s$'、'a$$' 和 '@$$'),所以我不打算在这里讨论这个问题。

祝你好运,快乐的正则表达式。

于 2013-05-14T15:22:52.950 回答