28

私はJavaScriptで次のものを使用して置換しようとしています:

r = "I\nam\nhere";
s = r.replace("\n"," ");

しかし、私に与える代わりに

私はここにいます

の値としてs、同じものを返します。

どこが問題なの?

4

9 に答える 9

46

他の人が述べたように、正規表現にはグローバルフラグがありません。正しい表現は、他の人があなたに与えたもののようなものでなければなりません.

var r = "I\nam\nhere";
var s = r.replace(/\n/g,' ');

最初からあったものとの違いを指摘したい。あなたは次のステートメントを使用していました

var r = "I\nam\nhere";
var s = r.replace("\n"," ");

ステートメントは確かに正しく、文字 \n の 1 つのインスタンスを置き換えます。これは別のアルゴリズムを使用します。置換する文字列を指定すると、最初に見つかった文字列が検索され、単純に 2 番目の引数として指定された文字列に置き換えられます。正規表現を使用すると、一致する文字を探すだけでなく、複雑な一致構文を記述でき、1 つまたは複数の一致が見つかった場合は置換されます。JavaScript の正規表現の詳細については、ここw3schoolsを参照してください。

たとえば、いくつかの異なるタイプのファイルからの入力を解析するために、作成したメソッドをより一般的にすることができます。オペレーティング システムの違いにより、改行が必要な場所に \n または \r を含むファイルが存在することは非常に一般的です。両方を処理できるようにするには、正規表現のいくつかの機能を使用してコードを書き直すことができます。

var r = "I\ram\nhere";
var s = r.replace(/[\n\r]/g,' ');
于 2012-12-28T16:56:21.297 に答える
13

使用するs = r.replace(/\\n/g," ");

参照を取得する

javascript置換コードの「g」は「貪欲」を表します。これは、可能であれば置換が複数回行われる必要があることを意味します。

于 2012-12-28T16:10:49.430 に答える
13

g問題は、フラグを使用してすべての一致を置き換える必要があることです。デフォルトでreplace()は、最初に見つかった一致にのみ作用するためです。

var r = "I\nam\nhere",
    s = r.replace(/\n/g,' ');

ただし、フラグを使用するgには、正規表現のアプローチを使用する必要があります。

ちなみに、変数を宣言するときは を使用してくださいvar。そうしないと、作成した変数がすべてグローバルになり、後で問題が発生する可能性があります。

于 2012-12-28T16:12:16.660 に答える
3

.replace()グローバル一致フラグが必要です:

s = r.replace(/\n/g, " ");
于 2012-12-28T16:13:28.610 に答える
1

以下を使用できます。

var s = r.replace(/\n/g,' ').replace(/\r/g,' ');

異なるSOは異なる方法を使用して「改行」を設定するためです。たとえば、Mac Unix Windowsの場合、この後、他の関数を使用して空白を正規化できます。

于 2016-07-13T16:49:58.660 に答える