我需要一个正则表达式可以匹配像
这样的javascript函数function abc(var1, var2){
...
}
...
abc : function(var1, var2){
...
},
...
答案 0 :(得分:7)
我知道这个问题是5岁,但与其他人所说的相反,我实际上已经根据你的要求编造了一个非常有效的模式。虽然相当复杂,但我已经在我自己的项目中多次使用过这种情况而且我还没有打嗝......希望我早点看到这个问题。希望这有所帮助(如果不适合你,希望那些正在寻找类似解决方案的人)
function\s*([A-z0-9]+)?\s*\((?:[^)(]+|\((?:[^)(]+|\([^)(]*\))*\))*\)\s*\{(?:[^}{]+|\{(?:[^}{]+|\{[^}{]*\})*\})*\}
答案 1 :(得分:4)
您是否正在尝试使用正则表达式解析JS?如果是这样,请不要。正则表达式是一个非常糟糕的解析器也可以看到这些问题。
RegEx match open tags except XHTML self-contained tags
If you're not supposed to use Regular Expressions to parse HTML, then how are HTML parsers written?
答案 2 :(得分:3)
在JS中,函数可以包含函数(反过来可以包含函数,等等):
x = function() {
this.y = function() { /* ... */ };
function z() { /* ... */ }
};
此外,您可以使用包含(子)字符串的字符串文字或注释,这些字符串看起来像函数:
var s = "function notAFunction(){}";
/*
function alsoNotAFunction(){}
*/
或包含你的正则表达式将会绊倒的部分函数:
function f() {
var s = "not a closing bracket: } ";
}
所以,回答你的问题是什么正则表达式匹配JS中的函数:它不存在。您应该/可以使用适当的解析器。
答案 3 :(得分:0)
今天,我面临着同样的挑战,我想在一个字符串中找到function definations
和function usages
。
并使用名为esprima
的解析器对其进行了解决。
(注意:这是针对nodejs的,不是针对浏览器javascript的。使用npm i esprima clipboardy
运行依赖项,并将代码放入index.js
并使用node index.js
运行)
var esprima = require('esprima');
const clipboardy = require('clipboardy');
var program = `
const answer = 42;
function foo(){
alert("hi")
}
`;
//esprima.tokenize(program)
var entries = []
parsed = esprima.parseScript(program, {}, function (node, meta) {
entries.push({
start: meta.start.offset,
end: meta.end.offset,
node: node
});
})
clipboardy.writeSync(JSON.stringify(entries, null, 2));
console.log('full parsed data copied to clipboard!')
//find function calls
var functionCalls = entries.filter(e => e.node.type == "CallExpression")
console.log('function calls: ' + JSON.stringify(functionCalls.map (a => {return {name: a.node.callee.name, start: a.start, end: a.end}})))
//find alert function calls
var alertFunctionCalls = entries.filter(e => e.node.type == 'CallExpression' && (e.node.callee.name == 'alert'))
console.log('alert function calls: ' + JSON.stringify(alertFunctionCalls.map (a => {return {start: a.start, end: a.end}})))
//find function definations
var functionDeclarations = entries.filter(e => e.node.type == 'FunctionDeclaration')
console.log('function definations: ' + JSON.stringify(functionDeclarations.map (a => {return {name: a.node.id.name, start: a.start, end: a.end}})))
//find foo() function defination
var fooFunctionDeclaration = entries.filter(e => e.node.type == 'FunctionDeclaration' && e.node.id.name == 'foo')
console.log('foo function definations: ' + JSON.stringify(functionDeclarations.map (a => {return {start: a.start, end: a.end}})))
//remove alert function calls
var program2 = program
alertFunctionCalls.sort((a, b) => { return b.end - a.end }).forEach(n => {
program2 = program2.substring(0, n.start) + program2.substring(n.end);
});
console.log('program after removing alert function calls: ' + program2)
答案 4 :(得分:0)
我不久前写了一个正则表达式来检测函数,因此我们可以检查是否为每个函数编写了文档,不是那么容易遵循,也不是一个令人惊奇的正则表达式,但是它似乎涵盖了许多不同之处函数声明的类型:
^(?:[\s]+)?(?:const|let|var|)?(?:[a-z0-9.]+(?:\.prototype)?)?(?:\s)?(?:[a-z0-9-_]+\s?=)?\s?(?:[a-z0-9]+\s+\:\s+)?(?:function\s?)?(?:[a-z0-9_-]+)?\s?\(.*\)\s?(?:.+)?([=>]:)?\{(?:(?:[^}{]+|\{(?:[^}{]+|\{[^}{]*\})*\})*\}(?:\s?\(.*\)\s?\)\s?)?)?(?:\;)?
在这里查看我测试过的类型:https://regex101.com/r/WGqfm8/9/
这不会处理所有情况,但应该抓住其中的大多数!
我故意没有添加的东西:
// won't find
const filterFn = apples.filter(() => {});
// won't find
const filterFn = apples.filter(function(){});
绝对没有我要讲的东西,但是我试图涵盖大多数基础知识,您只需要从匹配组中剪裁空白