0

私はVisual Studioコード拡張に取り組んでいます。拡張子は、エディタウィンドウで現在選択されているテキストに作用し、外部コマンド(私の場合はlein-cljfmtですが、私の質問とは無関係です)に送信されます。外部コマンドがテキストの処理を終えたら、現在のエディタセレクタをコマンドラインツールから返された結果に置き換えます。以下のようにエスケープされていないことに改行リテラルを含む複数行の文字列を正しくエスケープしたりエスケープしたりするにはどうすればよいですか?

contents 
    .replace(/\\/g, '\\\\') 
    .replace(/"/g, '\\"') 
    .replace(/\n/g, '\\n'); 

結果:私はこのようにそれをエスケープ文字列を送信する前に

contents 
    .replace(/\\n/g, '\n') 
    .replace(/\\"/g, '"') 
    .replace(/\\\\/g, '\\'); 

これは、すべてが、1つの場合に動作します:選択が処理されていることとき改行リテラルを含む文字列リテラルが含まれていると、エスケープ処理ではこれが改行され、エディタでコードが破損します。

これは私のエスケープを破るスニペットの例です。

(defn join 
    [a b] 
    (str a "\n" b)) 

は、私は今で

.replace(/(?!\B"[^"]*)\\n(?![^"]*"\B)/g, '\n') 

のような、非常にいくつかの正規表現の黒魔術を試してみましたが、ありません解決策を見つけることができませんでしたエッジケースはありません。私が行方不明になっているこれを行う方法はありますか?私はまた、それが私にとって一般的なシナリオであると思われるので、それを扱うことができるVSCode拡張APIがあるのだろうかと思います。

答えて

1

私は、これは何が必要かもしれないと思う:\nがあるどのように多くのスラッシュに応じて、異なる意味を持っているので

3つの段階に文字列をエスケープ解除しようとすると

function slashEscape(contents) { 
 
    return contents 
 
     .replace(/\\/g, '\\\\') 
 
     .replace(/"/g, '\\"') 
 
     .replace(/\n/g, '\\n'); 
 
} 
 

 
var replacements = {'\\\\': '\\', '\\n': '\n', '\\"': '"'}; 
 

 
function slashUnescape(contents) { 
 
    return contents.replace(/\\(\\|n|")/g, function(replace) { 
 
     return replacements[replace]; 
 
    }); 
 
} 
 

 
var tests = [ 
 
    '\\', '\\\\', '\n', '\\n', '\\\n', '\\\\n', 
 
    '\\\\\n', '\\\\\\n', '\\"\\\\n', '\n\n', 
 
    '\n\n\n', '\\n\n', '\n\\n', '\\n\\n', 
 
    '\\\n\\n\nn\n\\n\\\n\\\\n', '"', '\\"', '\\\\"' 
 
]; 
 

 
tests.forEach(function(str) { 
 
    var out = slashUnescape(slashEscape(str)); 
 
    
 
    // assert that what goes in is what comes out 
 
    console.log(str === out, '[' + str + ']', '[' + out + ']'); 
 
});

は本当に難しいですそれの直前。あなたの例では、元の文字列\n(スラッシュn)は\\n(スラッシュスラッシュn)としてエンコードされます。デコードすると、最初の2文字が最初の2文字と一致する場合、最後の2文字が最初の正規表現と一致します。 3番目のRegExp。あなたは確実にスラッシュを数える必要があります。一度にすべてのことを行うと、それらの先行するスラッシュを同時に解読することによってその問題が回避されます。

+0

答えをいただきありがとうございます。私はこれを少しでも開いておきたいと思いますが、VSCode APIを使用してこれを行うことができるかどうかを知る人もいます。 – m90

関連する問題