javascript - 用 javascript 将字符串中的 html 实体替换(LaTeX)命令

标签 javascript regex replace command latex

我有一本 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/

相关文章:

javascript - 如何仅在静态 URL 中插入元标记

java - 为什么java的Regex有时会抛出stackoverflow异常?

java - 使用 jSTL 替换 ("\"", "&ldquo;") 方法替代

android - 替换字符串中的UTF8字符

javascript - MVC - 编码错误的 JS 警告消息

javascript - 在状态 `becameInvalid` 中尝试处理事件 'root.loaded.saved'

regex - 如何使用 Google S2 Converter 将 markdown() 中的链接转换为与网站图标链接?

Javascript:正则表达式删除 .html

jquery - 延迟 5 秒后用文本替换图像

javascript - (Highcharts) x 轴日期格式与工具提示的日期格式不匹配