嵌套括号的正则表达式

regex for nested parenthesis

本文关键字:正则表达式 嵌套      更新时间:2023-09-26

使用javascript,im试图做一个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

我当然可以编写一个过程函数来做到这一点,这将是一个很好的解决方案。但我真的坚持了这一点。

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

因为这对正则表达式不友好,所以我把togethor放了几个函数来做你正在寻找的。 第一个将括号与深度匹配:

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",这就是您要查找的内容。 虽然这并不完全是正则表达式,但它用于上面的参数匹配函数。我不确定这是否适合您想到的任何用例,但希望它有所帮助。