如何匹配嵌套的函数字符串?

时间:2017-01-13 18:15:32

标签: javascript regex nested

我有一个字符串" 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中的某些库来处理此类问题?提前谢谢。

2 个答案:

答案 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]);
    }
  }
}