我在我的一个数学应用程序中解析Latex公式以转换为自定义格式,
我的要求是,当Latex公式有一个分数,即\frac{a}{b}
时,它必须转换为{a}/{b}
以下是我正在使用的正则表达式:
\\frac\{(((?![\{\}]).)*)\}\{(((?![\{\}]).)*)\}
这可以很好地解析像\frac{a}{b}
这样的简单案例,但是当我的分数在其完全失败的内部有子分数或花括号时
例如解析复杂的字符串,如下所示:(解析器在这种情况下失败)
\frac {(\frac{-b\pm\sqrt{b^2-4ac}}{2a})^{10^{15}_1}}{(\frac{a}{c})^{\frac{s}{d}}}\int_{a}^{b}
任何人都可以帮助我实现这个目标:
以下是我正在使用的完整代码:
function fraction(input) {
while (input.search(/\\frac\{(((?![\{\}]).)*)\}\{(((?![\{\}]).)*)\}/) >= 0) {
input = input.replace(/\\frac\{(((?![\{\}]).)*)\}\{(((?![\{\}]).)*)\}/g, "{$1}/{$3}");
}
if (input.search(/\\frac/) >= 0) {
input = fraction(input);
}
return input;
};

Enter formula: <input id="formula" onblur="console.log(fraction(document.getElementById('formula').value));"/> <button>Go</button>
&#13;
答案 0 :(得分:1)
这样的事情可能适合你:
/\\frac\s*{((?!\\frac{).*?)}{((?!\\frac{).*?)}/
它取代了内在的&#34;原子&#34; frac
直到所有人都被替换。
function fraction(input) {
var re = /\\frac\s*{((?!\\frac{).*?)}{((?!\\frac{).*?)}/,
bMatch = true;
while (bMatch) {
bMatch = false;
input = input.replace(re, function(tot, a, b) {
bMatch = true;
//console.log("[" + a + ", " + b + "]");
return '{' + a + '}/{' + b + '}';
});
}
return input;
}
function doAction() {
console.log(fraction(document.getElementById('formula').value));
}
&#13;
Enter formula: <input id="formula" value="\frac {(\frac{-b\pm\sqrt{b^2-4ac}}{2a})^{10^{15}_1}}{(\frac{a}{c})^{\frac{s}{d}}}\int_{a}^{b} " onblur="doAction()"/> <button onClick="doAction()">Go</button>
&#13;