var config = {
'(': ')',
'{': '}',
'[': ']',
'<': '>',
'*': '*',
'#': '#'
};
function checkParentheses(config, str) {
if (!str || !config) { return true; }
var stack = [];
var closeChars = Object.create(null);
Object.keys(config).forEach(function(open) {
var close = config[open];
closeChars[close] = open !== close;
});
for (var i = 0; i < str.length; ++i) {
var char = str.charAt(i);
var isClose = closeChars[char];
var closeForChar = config[char];
if (isClose) {
if (!stack.length || stack.pop() !== char) {
return false;
}
} else if (closeForChar) {
stack.push(closeForChar);
}
if (char === closeForChar) {
closeChars[char] = !closeChars[char];
}
}
return !stack.length;
}
alert(checkParentheses(config, '(aaa*hjhg*)'));
alert(checkParentheses(config, '(aaa*hjhg)'));
Добавить новые символы будет нетрудно. Если открывашка совпадает с закрывашкой, то режим для символа переключается, начинаясь с открывашки