嵌套括号的正则表达式

时间:2014-04-05 02:34:27

标签: javascript regex

使用javascript,我试图让node.js模块解析谓词逻辑语句。 我已经在这个正则表达式上工作了一段时间,我不能让它按照我想要的方式行事

1.     /\(((?:[^{}]*\([^{}]*\))*[^{}]*?)\)/
2.    .replace(/\)((?:[^{}]*\)[^{}]*\))*[^{}]*?)\(/,'):::(')

后者在(a&s&d&a&s&d)->(a&s&(d)&s|(d))这样的事情上工作正常,但我只是改变了分隔符...... 我试图做的是改变像

这样的陈述
((r|a)&(s|r))&(~r)->(r|(q&r))->q

进入

1->2->q

我当然可以编写一个程序功能来完成它,这将是一个很好的解决方案。但我真的坚持这个。

唯一真正的规范是正则表达式最需要尊重最外面的括号,并且能够替换单独的括号。

1 个答案:

答案 0 :(得分:0)

因为这不是正则表达式友好的,所以我提供了一些能够满足您需求的功能。第一个匹配括号与深度:

function match_parens(code_to_test, level, opening, closing){
    var sub_match, matched;
    return code_to_test.replace(new RegExp('^([^'+opening+closing+']*(.))[\\s\\S]*$'), function(full_match, matched, $2, offset, original){
        if ($2 == opening){
            sub_match = match_parens(original.substr(offset+matched.length), level + 1, opening, closing);
            matched = matched + sub_match
        }
        else if (level > 1){
            sub_match = match_parens(original.substr(offset+matched.length), level - 1, opening, closing);
            matched += sub_match;
        }
        return matched;
    });
}

此函数接受一个字符串并将所有内容返回到结束元素。

下一个函数可以帮助拉出传递给它的字符串,用括号中的所有内容替换不断增加的数字:

function pull_apart(testString){
    var count = 1,
            returnString = '',
            tempIndex = testString.indexOf('(');
    while (tempIndex !== -1){
        returnString += testString.substring(0,tempIndex)+count;
        count += 1;
        testString = testString.substring(testString.indexOf('(') + match_parens(testString.substr(tempIndex + 1), 1, '(', ')').length+1)
        tempIndex = testString.indexOf('(');
    }
    returnString += testString;
    return returnString;
}

正在运行pull_apart('((r|a)&(s|r))&(~r)->(r|(q&r))->q')会返回“1& 2-> 3-> q”,这正是您要寻找的。虽然这不完全是正则表达式,但它在上面的paren匹配函数中使用。我不确定这是否符合您的想法,但希望它有所帮助。