匹配正则表达式字符串不在2个字符串

时间:2016-01-07 22:19:03

标签: javascript regex

我试图找到未正确包装在$(document).ready($(function()中的jQuery字符串。

所以它会匹配这个:

console.log('something');
$('button').trigger('click');
$('div').css('color','red');
console.log('something else');

但它不匹配:

$(document).ready(function(){
  // More js here
  $('label').trigger('click');
  $('div.something').text('hello');
  // more js here
});

或者

$(function(){
  $('.test').append('<div>taco</div>');
});

我尝试过这样的事情:

(?=\$\(document)[\s\S]*\$\([\s\S]*\}\)

但它确实与我想要的相反......不确定反过来如何...

1 个答案:

答案 0 :(得分:2)

我不知道你将如何使用一个RegEx来做到这一点,但是你已经(接近)能够使用两个这样做了一半。

首先,找到要排除的块的任何出现,并用空字符串替换它们。

我会使用以下RegEx:

RegEx101 Test Case

/(?:\$|jQuery)\((?:document\)\.ready\()?function.*?\(\){(?:[^{]|{[^]*}\);?)+}\);?/gi

enter image description here

让我们打破这一点:

  • (?:\$|jQuery)查找“$”或“jQuery”,
  • \(寻找“(”,
  • (?:document\)\.ready\()?可选择查找“文档”.ready(“,
  • function寻找“功能”,
  • .*?非贪婪地查找零个或多个任何东西(通常函数只会跟()一起,但有时会使用命名函数,如function namedFunc()),
  • \(\){寻找“(){”,
  • (?:[^{]|{[^]*}\);)+寻找一个或多个:
    • [^{]查找不是“{”的字符,或者:
      • {查找“{”符号,后跟
      • [^]*查找零个或多个not-nothings(我会使用.*,但这与新行不匹配),接着是,
      • }\);?使用可选的“;”,
      • 查找“})”
  • }\);?使用可选的“;”,
  • 查找“})”
  • g是一个告诉RegEx引擎搜索多个匹配项的标志,
  • i是一个标志,告诉RegEx引擎以不区分大小写的方式进行搜索

一旦替换了所有匹配项,就可以搜索jQuery命令。 RegEx这样做比以前的RegEx简单得多。

RegEx101 Test Case

/(?:\$|jQuery)[(.].*?[;\n]/gi

enter image description here

让我们打破这个:

  • (?:\$|jQuery)查找“$”或“jQuery”,
  • [(.]查找“(”或“。”,
  • .*?非贪婪地查找零个或多个任何内容,
  • [;\n]寻找“;”或“\ n”,
  • g是一个告诉RegEx引擎搜索多个匹配项的标志,
  • i是一个标志,告诉RegEx引擎以不区分大小写的方式进行搜索

这是一个示例脚本,它使用这两个RegExes来查找您提供的示例输入中的命令。查看我上面提供的两个RegEx101.com测试用例,看看它如何适用于某些不同的情况。

var regexes = [
    // https://regex101.com/r/dO7qR7/7 lots more tests here
    /(?:\$|jQuery)\((?:document\)\.ready\()?function.*?\(\){(?:[^{]|{[^]*}\);?)+}\);?/gi,
    // https://regex101.com/r/dO7qR7/8
    /(?:\$|jQuery)[(.].*?[;\n]/gi
], match, matches = [];

var string = [
    "console.log('something');",
    "$('button').trigger('click');",
    "$('div').css('color','red');",
    "console.log('something else');",
    "",
    "$(document).ready(function(){",
    "  // More js here",
    "  $('label').trigger('click');",
    "  $('div.something').text('hello');",
    "  // more js here",
    "});",
    "",
    "$(function(){",
    "  $('.test').append('<div>taco</div>');",
    "});"
].join('\n');

console.log(string);

string = string.replace(regexes[0], '');

console.log(string);

while(match = regexes[1].exec(string)) matches.push(match[0]);

console.log(matches);

// ["$('button').trigger('click');", "$('div').css('color','red');"]