2016-09-17 2 views
1

Я пытаюсь избежать подмножества уценки, которые поддерживаются 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

Это на самом деле очень близко к тому, что я в конечном итоге придумал с собой и использую в настоящее время, но это не без побочных эффектов. Он решает проблему существующих двойных экранов на символах уценки, которые не экранируются, но также полностью исключает существующие обратные косые черты из строки. Если строка должна содержать необработанную обратную косую черту (например, пути Windows) с \\, она полностью исчезнет из результата. – Gawdl3y

+0

Отредактировано первое регулярное выражение, чтобы отменить только 5 специальных символов. – qxz