我有一个字符串" sum(sum(_))" 其中_可以是一个或多个(用逗号分隔)函数调用,引号之间的字符串等等。
//should return true
/sum\(sum\(_\)\)/.test('sum(sum(2,3,4))')
/sum\(sum\(_\)\)/.test('sum(sum(a,b,c))')
/sum\(sum\(_\)\)/.test('sum(sum(neg(2),neg(neg(3))))')
我实际上可以匹配字符串和其他参数,但是当我尝试匹配嵌套函数调用时会出现复杂情况。
任何人都知道如何使用正则表达式或javascript中的某些库来处理此类问题?提前谢谢。
答案 0 :(得分:1)
我建议您使用下面的解析器来获取内部字符串。
var nestedFunctions = getInnerString("sum(sum(neg(2),neg(neg(3))))", 8)
console.log(nestedFunctions); // should return -> neg(2),neg(neg(3))
function getInnerString(text, startIndex) {
startIndex = !startIndex ? 0 : startIndex;
var endIndex = getEndIndexForParathesis(text, startIndex);
var innerString = text.substring(startIndex, endIndex);
return innerString;
}
function getEndIndexForParathesis(text, start) {
start = !start ? 0 : start;
var subGroups = 0
var endIndex = 0;
for (var i = start, len = text.length; i < len; i++) {
var letter = text[i]
if (letter === '(') {
subGroups++;
continue;
}
if (letter === ')' && subGroups != 0) {
subGroups--;
continue;
}
if (letter === ')' && subGroups == 0) {
endIndex = i;
break;
}
}
return endIndex;
}
我希望这适合你。我尝试了正则表达式,但在所有三种情况下提取内部文本变得非常困难。
答案 1 :(得分:0)
以下是解析算法的示例。如果您在函数调用中不使用逗号,则效果最佳。逗号目前只在顶级工作。如果要使用逗号,则需要进一步改进算法。这只是初稿,为您提供了如何递归解析表达式的提示:
var expression = "neg(2),neg(neg(3))";
var data = [];
parse(data, expression);
console.log(data);
function parse(data, expression) {
var expressionArray = expression.split(",");
for(var i = 0; i < expressionArray.length; i++) {
var element = expressionArray[i];
var match = element.match(/^([a-zA-Z]+?)\((.*)\)$/);
var entry = {};
data.push(entry);
entry.element = element;
entry.children = [];
if(match) {
entry.function = match[1];
parse(entry.children, match[2]);
}
}
}