我有一本 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
的反斜杠成为第一个替换的一部分,因此不再匹配。
基本结构是否有效?
非常感谢帮助。
最佳答案
问题是正则表达式中的最后一个子模式是一个取反字符类,它实际上消耗输入,在下一次迭代期间没有机会匹配下一个实体。
只需将它放在具有非否定字符类的否定前瞻中:
\\leftarrow(?![a-zA-Z])
或
var re = RegExp('\\' + translations[k].tex + '(?![a-zA-Z])', 'g');
参见 regex demo
查看更多信息 how negative lookahead works (一般来说,环顾四周)。
关于javascript - 用 javascript 将字符串中的 html 实体替换(LaTeX)命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33866428/