Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/89.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript动态正则表达式_Javascript_Jquery_Regex - Fatal编程技术网

Javascript动态正则表达式

Javascript动态正则表达式,javascript,jquery,regex,Javascript,Jquery,Regex,看了这里之后,我想出了一个模式,用字符串来测试单词数组 $.each(data, function(index, val) { var pattern = new RegExp('?:^|\s'+ val + '?=\s|$', 'g'); console.log(pattern.test(comment)); if (!pattern.test(comment)) { yay = true;

看了这里之后,我想出了一个模式,用字符串来测试单词数组

$.each(data, function(index, val) {
    var pattern = new RegExp('?:^|\s'+ val + '?=\s|$', 'g');
    console.log(pattern.test(comment));
    if (!pattern.test(comment)) {                           
           yay = true;
         }
});
这里的问题是它总是返回true。有什么建议吗?谢谢

修复此行:

var pattern = new RegExp('(?:^|\s)'+ val + '(?=\s|$)', 'g');
您可能还发现使用以下在线实用程序调试/验证正则表达式很有用:


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

从您的JSFIDLE中,我派生并创建了一个我自己的解决方案,以及您的解决方案(使用注释中的正则表达式),一旦清除了所有的小错误。然而,它可以是很多很多。以下是我的不同做法:

$('#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
(全局)修饰符。在其他应用程序中,您可能需要它—例如,如果您想突出显示冒犯的单词—但为此,我放弃了它。对于不区分大小写的行为,应该使用
i
修饰符

这样做最大的好处是,如果您愿意,可以选择在这个函数之外定义正则表达式,您将看到非常显著的速度提升

缺点:当你的脏话列表越来越长时,回报会越来越少。但考虑到这一点,你的方式还需要一段时间才能变得更好(很长一段时间)

注意

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


祝你好运,快乐注册。

你的模式有三个较小的模式,由
|
(或)分隔,因此如果任何较小的模式匹配,这将是真的-我认为任何字符串都将匹配最后一部分。为什么您的模式以
?:
开头?您缺少了非捕获组和前瞻的括号。您还应该在控制台中检查正则表达式的最终字符串表示形式,以便更好地调试。@elclars我尝试了
var pattern=new RegExp('(?:^ | \\s)('+val+)(?=\\s |$),'g')我还意识到我还缺少一个斜杠。但是它仍然不起作用。@LouieV您想用正则表达式做什么?尝试:
pattern=newregexp('\\b'+val+'\\b')如果要匹配整个单词。