4

我需要替换网页中的 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,但事实是正则表达式只替换了它就像'*replaced*b^2$'。我需要一些帮助~~

4

4 回答 4

2

以下正则表达式

/(\${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;
}
于 2012-10-26T05:52:10.307 回答
1

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

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

如果您还想匹配分隔符之外的文本:

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

测试

于 2018-03-09T09:25:11.223 回答
0

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

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

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

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

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

于 2012-10-26T04:23:23.160 回答
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/ 如果公式总是以 = 和数字结尾,以捕捉中间的那些 \$ . 如果这不起作用,请提供更多示例,以便我们找到匹配项。

于 2012-10-26T16:24:01.650 回答