我需要在网页中替换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 $”。我需要一些帮助~~
答案 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