使用Javascript在网页中查找LaTex指令的正则表达式

时间:2012-10-26 02:58:27

标签: javascript regex latex mathjax

我需要在网页中替换LaTex指令。 LaTex指令包含两个'$'符号,如$ a ^ 2 + b ^ 2 = 1 $(内联公式)或$$ a ^ 2 + b ^ 2 = 1 $$(块公式将会以新的一行显示)。 现在的问题是我想使用Javascript将某些指令替换为某些图片(对应于这些指令),因为浏览器本身显然无法以LaTex风格显示这些公式。 (见图)a^2+b^2=1如何使用正则表达式执行此操作?我在下面展示了我的工作,但有一些问题。 对于内联公式,我使用:

var reg = /\$([^$]|(\\$))*\$(?=[^$])/mg

这意味着我希望一些文本以$开头,之后是否为'not $'或者是'\ $'或者什么都没有,并以'$'结尾但是在结束之后不会允许$的上涨。听起来不错.. 但是对于这样的文字:$ a ^ 2 \ $ b ^ 2 $显然,我希望它会显示为(见图片)a^2\$b^2,但事实是正则表达式只替换它的一部分,如'* replacement * b ^ 2 $”。我需要一些帮助~~

4 个答案:

答案 0 :(得分:1)

以下RegExp

/(\${1,2})((?:\\.|.)*)\1/

将匹配一个或两个美元的LaTex块。请注意使用反向引用\ 1来匹配开始标记。

如果LaTex块可以扩展ovver线边界,则使用

/(\${1,2})((?:\\.|[\s\S])*)\1/

要在字符串中进行全局替换,请说source

source.replace (/(\${1,2})((?:\\.|[\s\S])*)\1/g, function (m, tag, src) {
  // m is the entire match
  // tag is '$' or '$$' 
  // src is the internal text

  var rslt = ''; 

  // create what you want to appear in rslt.

  return rslt;
}

答案 1 :(得分:0)

我不知道LaTex,但看起来你试图用一行代码做太多。尝试使用逻辑if else语句,如下所示:

if (var reg =/\$\$(.*?)\$\$/msg
    {block_formula=$1}

elsif (var reg=/\$(.*?)\$/msg
    {inline_formula=$1}

这意味着“如果reg开始和结束为$$,它是一个块公式,包含$$之间的任何内容。否则,如果reg开始和以$结尾,它是一个内联公式,包含$之间的任何内容。“

此外,如果它只替换部分正则表达式,请务必使用-s标志以确保它与所有实例匹配。

答案 2 :(得分:0)

我不知道LaTex,但看起来你试图用一行代码做太多。尝试使用逻辑if else语句,如下所示:

if(var reg = / \ $ \ $(。*?)\ $ \ $ / msg     {block_formula = $ 1}

elsif(var reg = / \ $(。*?)\ $ / msg     {inline_formula = $ 1}

这意味着“如果reg开始和结束为$$,它是一个块公式,包含$$之间的任何内容。否则,如果reg开始和以$结尾,它是一个内联公式,包含$之间的任何内容。“

编辑:尝试正则表达式更像/(\ $ {1,2})(\ S {2,10} = \ d +)$ 1 /如果公式总是以=和数字结尾,以捕获那些\ $的在中间。如果这不起作用,请提供更多示例,以便我们找到匹配项。

答案 3 :(得分:0)

以下正则表达式包含新行(有时您有大型公式,因此有多行):

/(\${1,2})[^]*?[^\\]\1/gm

如果你想匹配分隔符之外的文字:

/(\${1,2})[^]*?[^\\]\1|[^\$]+\1/gm

Tests