【发布时间】:2016-02-25 06:53:11
【问题描述】:
我有一本 LaTeX 命令/html 实体的字典:
var translations = [
{tex: '\\latex', html: 'LaTeX'},
{tex: '\\cup', html: '∪'},
{tex: '\\cap', html: '∩'},
{tex: '\\ldots', html: '…'},
{tex: '\\leftarrow', html: '←'},
{tex: '\\leftrightarrow', html: '↔'}
...
];
现在我想用它的 html 实体替换每个 LaTeX 命令。我猜最好的基本结构是这样的:
function translateFromTexToHTML(string) {
for (i = 0; i < translations.length; i += 1) {
re = new RegExp('...\\' + translations[i].tex + '...');
string = string.replace(re, '...' + translations[i].html);
}
return string;
}
不幸的是,我无法弄清楚我需要哪个正则表达式。我试过这个:
var re = new RegExp('\\' + translations[k].tex + '([^a-zA-Z])', 'g');
string .replace(re, translations[k].html + '$1');
这部分有效,例如,
\leftarrow \leftrightarrow becomes ← ↔
但是,例如,
\leftarrow\leftrightarrow becomes ←\leftrightarrow instead ←↔
我猜这是因为第二个 \cup 的反斜杠成为第一个替换的一部分,因此不再匹配。
基本结构也有效吗?
非常感谢您的帮助。
【问题讨论】:
-
我检查了最后一个正则表达式,看来您只是在 tex 之后使用了字母。将其放入前瞻中:
\\leftarrow(?=[^a-zA-Z])。或者,只使用单词边界\\leftarrow\b(这意味着在非单词(不是[a-zA-Z0-9_]字符之前匹配w)。即var re = RegExp('\\' + Tools.SVG.translations[k].tex + '\\b', 'g');。 -
谢谢。不幸的是,它不适用于字符串末尾的命令。 (LaTeX 实际上接受
\leftarrow7作为命令\leftarrow后跟(非命令)数字7。所以单词边界不起作用。但前瞻可以。) -
就像一个注释:我还想在命令末尾删除一个可选空格,因此可以让
A\leftarrow B以最小的空间出现,如A←B:(\\s|(?![a-zA-Z])) -
你甚至可以使用非捕获组然后:
(?:\\s|(?![a-zA-Z]))(保持正则表达式捕获缓冲区清洁)。 -
谢谢。虽然我不确定“保持正则表达式捕获缓冲区清洁”是什么意思...
标签: javascript regex replace command latex