转义markdown的Discord子集

问题描述:

我试图逃避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

我会建议进行反向转义任何已经转义字符,然后再逃避一切:

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