我是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是一个方便的正则表达式测试器......答案 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:删除正则表达式中的分隔符/
)