2015-11-23 96 views
2

命令由HTML實體我有一本字典的LaTeX命令/ HTML實體:更換(膠乳)字符串與JavaScript

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的反斜槓成爲部分更換第一個,因此不再匹配。

也是基本結構高效?

非常感謝。

+1

我檢查了最後一個正則表達式,看起來你只是在* tex *之後使用這個字母。把它放在前面:'\\ leftarrow(?= [^ a-zA-Z])'。或者,只要使用一個字邊界'\\ leftarrow \ b'(這意味着*在非單詞之前匹配'w'(不是'[a-zA-Z0-9_]'字符*),也就是'var re = RegExp('\\'+ Tools.SVG.translations [k] .tex +'\\ b','g');'。 –

+0

謝謝,不幸的是它不適用於字符串末尾的命令。 LaTeX實際上接受'\ leftarrow7'作爲命令'\ leftarrow',然後是(非命令)數字'7',所以這個詞邊界不起作用,但是這個向前看起來是這樣的。) – Daniel

+0

正如一個音符:我也想在命令結束時刪除一個可選空間,這樣就有可能讓'A \ leftarrow B'以最小的空間出現爲'A←B':'(\\ s |(?![a-zA- Z]))' – Daniel

回答

1

問題是您的正則表達式中的最後一個子模式是否定字符類,實際上消耗了輸入,在下一次迭代期間沒有機會與下一個實體匹配。

只要將其與非否定字符類負前瞻內:

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

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

regex demo

查看更多關於how negative lookahead works(在一般情況下,lookarounds )。

+0

對不起,我通過複製和粘貼('Tools.SVG.translations = translations')搞亂了變量名。我向前追加了一個字符串字符'$'的結尾,以匹配字符串的結尾:'(?= [^ a-zA-Z] | $)'。那是對的嗎? – Daniel

+0

使用具有積極字符類的負向前視,您不需要指定字符串替代的結尾,這樣我添加了正則表達式演示。 –

+0

謝謝。似乎工作! – Daniel