使用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
我当然可以编写一个程序功能来完成它,这将是一个很好的解决方案。但我真的坚持这个。
唯一真正的规范是正则表达式最需要尊重最外面的括号,并且能够替换单独的括号。
答案 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匹配函数中使用。我不确定这是否符合您的想法,但希望它有所帮助。