0

これは答えられているので、ここに最も簡単な答えを入れます。(ベルギのおかげ)

まず、「useWord」ですべての特殊文字がエスケープされていることを確認します

useWord.replace(/([{}()[\]\\.?*+^$|=!:~-])/g, "\\$1");

次に、次のように置き換えます。

strIn.replace(new RexExp("\b"+userWord+"\b", "igm",replaceWord);

元の質問には回答がありますが、記号を単語 ($ を HKD など) に置き換える必要がある場合もあるため、上記の回答は機能しません。

/\$/.test("10 $ ") = true
/\b\$\b/.test("10 $ ") = false

そこに単純なエラーがあったため、コードを変更しました:

([^A-Z]||^)

する必要があります

([^A-Z]|^) 

コードの詳細な説明は次のとおりです。

ユーザーは、単語 (=userWord 変数) とそれを置き換える単語 (=replaceWord 変数) を指定できます。

例えば:

usWord="博士";replaceWord="博士"

単語 dr を Dr に置き換えます。

大文字と小文字を区別しない必要があるため、DR、dR、Dr、および dr は Dr に置き換えられます。問題は、ユーザーが正規表現について知らないため、「userWord」変数をエスケープする必要があることです: (Bergi さん、ありがとう)

userWord = userWord.replace(/([{}()[\]\\.?*+^$|=!:~-])/g, "\\$1");

ここで、JavaScript に「単語」とは何かを伝えるので、「ドライブ」は置き換えられず、「Dr.ive」のように見えます (編集: 元のコードは間違っていました。| の代わりに || がありましたが、現在は修正されています)。

([^AZ]|^) は、単語の前に英字がないか、単語が行頭にあることを意味します。(「dream」と「drive」は一致しますが、「bandr」は一致しません)

([^AZ]|$) は、単語の後に英字がないか、単語が行末にあることを意味します。(「夢」と「ドライブ」はもう一致しません)

r=new RexExp("([^A-Z]|^)("+userWord+")([^A-Z]|$)","igm");

変数 strIn が、置換する必要がある単語を含むテキストであるとします。次に、置換を開始できます。

strIn=strIn.replace(r,replaceWord);

If strIn = "Julia and dr Ben." userWord="dr" および replaceWord="Dr." 出力は次のとおりです。

「ジュリアとベン。」

おっと、最初と最後のグループを置き換えない最も簡単な方法が何であるかはまだわかりません(明日、正規表現のチュートリアルを読むことを約束します)。これまでに思いついた解決策は次のとおりです。

strIn=strIn.replace(r,function(a,b,c,d){
    return b + replaceWord + d;
});

|| を使用したため、これは以前は機能しませんでした。|の代わりに

私のアプリケーションでは、userWord と replaceWord は 1 つの値ではなく配列ですが、この場合は問題ではありません。これが完全なコードです (動作) Jim O'Brien のおかげで、さまざまなグループに $ を使用してコードを簡略化できました:

userWord="dr";
replaceWord="Dr.";
strIn="Julie was driving dr David."
userWord = userWord.
    .replace(/([{}()[\]\\.?*+^$|=!:~-])/g, "\\$1");
r=new RexExp("([^A-Z]|^)("+userWord+")([^A-Z]|$)","igm");
strIn=strIn.replace(r, "$1" + replaceWord + "$2");
return strIn;
4

1 に答える 1

3

単語境界アンカーを使用してみてください:

var r = new RegExp("\b"+userWord+"\b", "ig");
return strIn.replace(r, replaceWord);

また、正規表現のエスケープは完全ではありません。使用する

userWord.replace(/([{}()[\]\\.?*+^$|=!:~-])/g, "\\$1");

(パイプの後の最後のいくつかは、正規表現でエスケープされた文字列を使用する場所に応じて、多かれ少なかれオプションです)。

于 2012-09-30T09:30:31.137 に答える