【问题标题】:Replace (LaTeX) commands by html entities in string with javascript用javascript字符串中的html实体替换(LaTeX)命令
【发布时间】: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


【解决方案1】:

问题在于,正则表达式中的最后一个子模式是一个否定字符类,它实际上使用输入,在下一次迭代期间没有机会匹配下一个实体。

只需将它放在带有非否定字符类的否定前瞻中:

\\leftarrow(?![a-zA-Z])

var re = RegExp('\\' + translations[k].tex + '(?![a-zA-Z])', 'g');

regex demo

how negative lookahead works 上查看更多信息(以及一般情况下的外观)。

【讨论】:

  • 对不起,我通过复制和粘贴弄乱了变量名 (Tools.SVG.translations = translations)。我在前瞻中添加了字符串结尾字符 $ 以匹配字符串结尾:(?=[^a-zA-Z]|$)。对吗?
  • 将负前瞻与正字符类一起使用,您不需要像我添加正则表达式演示那样指定字符串替代的结尾。
猜你喜欢
  • 2023-03-11
  • 2023-04-11
  • 2012-06-14
  • 2012-12-29
  • 2019-03-20
  • 2018-10-21
  • 2017-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多