正则表达式用'替换'\\'但仅在某些标签之外

时间:2013-06-11 00:13:42

标签: html regex replace latex mathjax

我是regex的新手,并且在这一段时间里一直在苦苦挣扎:我想将LaTeX文件转换为HTML。

我使用mathjax渲染方程式和一些javascript替换函数来转换标签。我差不多完成了,但是我仍然遇到换行问题:我需要将\\转换为<br>,但在标记\begin{array}之外仅 \end{array}

示例:在此部分中,只应替换\\之前的Montrer l'equivalence

$M=\left(
\begin{array}{c|c}
A &B \\ \hline
C &D \\ 
\end{array}
\right)$

$in$ $\mathcal{M}_{n}(\mathbb{K})$ avec $A$ $\in$ $\mathcal{M}_{r}(\mathbb{K})$ inversible.\\ Montrer l'equivalence:
\[
\Bigl( rg(A) = rg(M)  \Bigr) \Leftrightarrow \Bigl( D = CA^{-1}B \Bigr)
\]


\begin{enumerate} 
\item Calculer $detB$ en fontion de $A$. 
\item En déduire que $detB \geqslant 0$.
\end{enumerate}

$M=
\left(
\begin{array}{c|c}
A &B \\ \hline
C &D \\ 
\end{array}
\right)$

如何使用正则表达式执行此操作?

编辑:我发现here是一个方便的正则表达式测试器......

1 个答案:

答案 0 :(得分:3)

您可以使用返回第一个捕获组的回调函数替换此模式,或者当它无效时使用<br>

/(\\begin{array}(?:[^\\]+|\\(?!end{array}))*\\end{array})|\\\\/

我们的想法是在\begin{array}...\end{array}之前匹配\\,以避免在\\内找到\begin{array}...\end{array}

细节:

(?:                   # open a non-capturing group
    [^\\]+            # all characters but \ 1 or more times
  |                   # OR
    \\(?!end{array})  # \ not followed by "end{array}"
)*                    # close non-capturing group, zero or more times

这种结构比简单的.*?更有效,它需要很多回溯才能成功。它有点长,但性能更高,因为它避免了懒惰的量词。

(ps:删除正则表达式中的分隔符/