2016-09-17 39 views
1

我試圖逃避Discord支持的降價子集(*,_,`,~)。 已經轉義的字符不應該添加額外的反斜槓。 這是我有:轉義markdown的Discord子集

function escapeMarkdown(text) { 
 
\t return text.replace(/([^\\]|^|\*|_|`|~)(\*|_|`|~)/g, '$1\\$2'); 
 
} 
 

 
console.log(escapeMarkdown('*test* _string_ ~please~ `ignore` *_`~kthx \* \\~'));

這工作得很好,減去事實,即對對方多次降價字符不會全部逃脫。我不確定如何擴大這個範圍,以免讓表達過於複雜。

+2

如果角色已經在它前面的一個反斜槓,這並不一定意味着它是逃脫,例如'\\〜' – qxz

+0

@qxz你完全正確。 – Gawdl3y

回答

1

我會建議進行反向轉義任何已經轉義字符,然後再逃避一切:

function escapeMarkdown(text) { 
 
    var unescaped = text.replace(/\\(\*|_|`|~|\\)/g, '$1'); // unescape any "backslashed" character 
 
    var escaped = unescaped.replace(/(\*|_|`|~|\\)/g, '\\$1'); // escape *, _, `, ~, \ 
 
    return escaped; 
 
} 
 

 
var str = '*test* _string_ ~please~ `ignore` *_`~kthx \* \\~ C:\\path\\to\\file'; 
 
console.log("Original:"); 
 
console.log(str); 
 
console.log("Escaped:"); 
 
console.log(escapeMarkdown(str));

+0

這實際上非常接近我最終提出並正在使用的東西,但它並非沒有副作用。它確實解決了markdown字符上現有的雙重轉義問題未被轉義的問題,但它也完全消除了字符串中現有的反斜槓。如果字符串應該包含\\反斜槓(如Windows路徑),它將完全從結果中消失。 – Gawdl3y

+0

編輯第一個正則表達式,僅僅使用5個特殊字符。 – qxz