Java-скрипт Регулярное выражение для разбора Latex \ frac - PullRequest
0 голосов
/ 03 мая 2018

Я анализирую латексную формулу в одном из моих математических приложений для преобразования в пользовательский формат, Мое требование заключается в том, что когда латексная формула имеет дробь, т.е. \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>

1 Ответ

0 голосов
/ 03 мая 2018

Что-то вроде этого может сделать это для вас:

/\\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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...