我试图找到未正确包装在$(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]*\}\)
但它确实与我想要的相反......不确定反过来如何...
答案 0 :(得分:2)
我不知道你将如何使用一个RegEx来做到这一点,但是你已经(接近)能够使用两个这样做了一半。
首先,找到要排除的块的任何出现,并用空字符串替换它们。
我会使用以下RegEx:
/(?:\$|jQuery)\((?:document\)\.ready\()?function.*?\(\){(?:[^{]|{[^]*}\);?)+}\);?/gi
让我们打破这一点:
(?:\$|jQuery)
查找“$”或“jQuery”,\(
寻找“(”,(?:document\)\.ready\()?
可选择查找“文档”.ready(“,function
寻找“功能”,.*?
非贪婪地查找零个或多个任何东西(通常函数只会跟()
一起,但有时会使用命名函数,如function namedFunc()
),\(\){
寻找“(){”,(?:[^{]|{[^]*}\);)+
寻找一个或多个:
[^{]
查找不是“{”的字符,或者:
{
查找“{”符号,后跟[^]*
查找零个或多个not-nothings(我会使用.*
,但这与新行不匹配),接着是,}\);?
使用可选的“;”,}\);?
使用可选的“;”,g
是一个告诉RegEx引擎搜索多个匹配项的标志,i
是一个标志,告诉RegEx引擎以不区分大小写的方式进行搜索一旦替换了所有匹配项,就可以搜索jQuery命令。 RegEx这样做比以前的RegEx简单得多。
/(?:\$|jQuery)[(.].*?[;\n]/gi
让我们打破这个:
(?:\$|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');"]