ウェブサイト検索

javascript - 複数文字に対して正規表現が機能しない


与えられた文字列からマークダウンの特殊文字(すなわち \`*_{}[]()#+.!|-)を検索して置換したいです。

C#では@という逐語的識別子があるので簡単に動作させることができますが、Javascriptでは何が問題なのか分かりません。どうやら/gに関係しているようです。別の投稿でreplaceAllを使うように書かれていましたが、stringにそのメソッドが見つかりませんでした。

C# バージョン

string test = @"B 
*H*
C
**AB**";
Console.WriteLine ("Input    " + test);

var pattern = @"[\\`*_{}\[\]()#+-.!]";
var _1 = Regex.Replace (test, "\r?\n", "<br/>");
var out_ = Regex.Replace (_1, pattern, m => @"\" + m.Value);
Console.WriteLine ("Output   " + out_);

TypeScript バージョン

const regexM = new RegExp(/["`\*\_\{\}\[\]\(\)#\+-\.!\|]/g, 'm');

var input = `B 
*H*
C
**AB**`;

var inputString = input.replace(regexM, function (y: any) { return "\\" + y; });

if (/\r|\n/.exec(inputString))
{
    inputString = inputString .replace(/\r?\n/g, "<br/>");
}

inputString = inputString.replace(regexM, function (x: any)
{
    return "\\" + x;
});

期待される: B <br/>\*H\*<br/>C<br/>\*\*AB\*\*

私は B <br/>\*H*<br/>C<br/>**AB** を取得しています

回答 #1

あなたは使用してもよい

const regexM = /[\\`*_{}[\]()#+.!|-]/g;

var input = `B 
*H*
C
**AB**`;

var inputString = input.replace(regexM, "\\$&");
inputString = inputString.replace(/\r?\n/g, "<br/>");
console.log(inputString);
// => B <br/>\*H\*<br/>C<br/>\*\*AB\*\*

注意:

  • `regexM` の正規表現での `-` は範囲を形成するので、エスケープするか、上記のコードのように文字クラスの末尾に置く必要があります
  • コールバックメソッドを使用する代わりに、完全一致を参照するためには、文字列置換パターンで $& プレースホルダーを使用できます
  • 正規表現リテラルを使用して正規表現を定義する場合、正規表現のエスケープを作るのに必要なバックスラッシュは1つだけです。したがって、const regexM=/[\\`*_{}[\]()#+.!|-]/g は const regexM=new RegExp("[\\\\`*_{}[\\]()#+.!|-]", "g") と同じです。
  • if (/|\n/.exec(inputString))で改行文字があるかどうかを確認する必要はありません、ただ.replaceを実行してください。