首页 > 解决方案 > JavaScript 正则表达式解析 Latex \frac

问题描述

我正在我的一个数学应用程序中解析 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>

标签: javascriptregexlatex

解决方案


这样的事情可能会为你做:

/\\frac\s*{((?!\\frac{).*?)}{((?!\\frac{).*?)}/

它从内部“原子”替换,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));
}
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>


推荐阅读