JavaScriptを使用して文字列内のすべてのドットを置き換える方法


426

.JavaScript文字列内のすべてのドット()を置き換えたい

たとえば、私は:

var mystring = 'okay.this.is.a.string';

取得したい:okay this is a string

これまでのところ、私は試しました:

mystring.replace(/./g,' ')

しかし、これはすべての文字列がスペースに置き換えられることになります。


8
aefxxの答えは正しいですが、FYIと同様に、正規表現のピリオド文字はすべてに一致することを意味するため、すべてがスペースになります。バックスラッシュでエスケープすると、ピリオドで一致することになります。
swilliams 2010

先端をありがとう。RegexでAHAの瞬間があります(アプリのビルド時)。本当に嫌いです_、クールで良いチュートリアルはありますか?
Omar Abid

rubular.comはあなたが探しているものです
LanguagesNamedAfterCofee


残念ながら、非正規表現では文字列を複数回置換できるようには見えません。
Steven Lu

回答:


777

.正規表現では「任意の文字」の意味があるため、エスケープする必要があります。

mystring = mystring.replace(/\./g,' ')

25
明確にするために、\はのような正規表現の特殊文字をエスケープします。この場合
realgt '09 / 09/27

sedのように見えます。どういうわけか.. :)
Paschalis

レガカール式ではドット。すべてを意味し、これが正しい解決策です!
ベンジャミン・フエンテス

1
@Kingalione正確に何が機能しないのですか?詳しく説明してもらえますか?
aefxx

1
@Webwomanこれgが、式の最後の修飾子が使用される目的です。(g)loballyと考えてください。
aefxx

302

理解しやすいもう1つのソリューション:)

var newstring = mystring.split('.').join(' ');

25
@HaggleLad。正規表現をいじる必要がないため
ton.yeung

5
これは正規表現よりもはるかに遅くありませんか?
Jasper Kennis

1
@Jasperは私の理解から、実際にはほとんどのブラウザでより高速ですが、実際に自分でベンチマークを行ったわけではありません。
アンドリュー

9
@BetoFregaあなたのケースを作るためのいくつかの経験的データのようなものはありません:)。リンクを提供してくれてありがとう!
テスト123 2012

3
RegExpを使用する場合、ループの外側の別の変数に正規表現を保存する必要があります。正規表現のコンパイル/解釈には時間がかかりますが、コンパイルすると、かなり高速に使用できます。私が行ったこれらのテストを試してください:jsperf.com/replace-vs-split-join-vs-replaceall/23
sanderd17

53
/**
 * ReplaceAll by Fagner Brack (MIT Licensed)
 * Replaces all occurrences of a substring in a string
 */
String.prototype.replaceAll = function( token, newToken, ignoreCase ) {
    var _token;
    var str = this + "";
    var i = -1;

    if ( typeof token === "string" ) {

        if ( ignoreCase ) {

            _token = token.toLowerCase();

            while( (
                i = str.toLowerCase().indexOf(
                    _token, i >= 0 ? i + newToken.length : 0
                ) ) !== -1
            ) {
                str = str.substring( 0, i ) +
                    newToken +
                    str.substring( i + token.length );
            }

        } else {
            return this.split( token ).join( newToken );
        }

    }
return str;
};

alert('okay.this.is.a.string'.replaceAll('.', ' '));

正規表現を使用するよりも高速...

編集:
多分私がこのコードを実行したとき、私はjsperfを使用しませんでした。しかし、結局のところ、そのような議論はまったく意味がありません。パフォーマンスの違いは、実際のコードの読みやすさには値しません。そのため、パフォーマンスが正規表現のアプローチと異なっていても、私の答えは有効です。

EDIT2:
私はあなたが流暢なインターフェースを使用してこれを行うことを可能にするlibを作成しました:

replace('.').from('okay.this.is.a.string').with(' ');

https://github.com/FagnerMartinsBrack/str-replaceを参照してください


1
非常に便利。注意:アラート文のセミコロンの後には不正な文字が含まれています。
Patrick、

「ローグキャラクター」とはどういう意味ですか?
Fagner Brack 2013

1
彼は実体を意味します​ 2回、これはUnicode文字「ZERO WIDTH SPACE」(U + 200B)です。詳しい情報fileformat.info/info/unicode/char/200b/index.htm
・クール

@FagnerBrack str.toLowerCase()パフォーマンス上の理由から、ループの外に移動する必要があります。また、検索している文字列を操作することは、おそらく最適とは言えません。:私は修正されたバージョンで答えを投稿stackoverflow.com/questions/2390789/...
sstur

@sstur操作後に文字列をもう一度小文字にする必要があると思います。検索している文字列を操作すると、パフォーマンスにかなりの違いがありますか?読みやすさはメリットを超えていると思います(テストされていません)。
Fagner Brack 2014年


15

この単純なシナリオでは、JavaScriptに組み込まれているメソッドを使用することもお勧めします。

あなたはこれを試すことができます:

"okay.this.is.a.string".split(".").join("")

ご挨拶


6

ドットに2つのバックスラッシュを追加して機能させます。乾杯。

var st = "okay.this.is.a.string";
var Re = new RegExp("\\.","g");
st = st.replace(Re," ");
alert(st);

4

これはより簡潔/読みやすく、Fagner Brackによって投稿されたものよりもパフォーマンスが良くなるはずです(toLowerCaseはループで実行されません)。

String.prototype.replaceAll = function(search, replace, ignoreCase) {
  if (ignoreCase) {
    var result = [];
    var _string = this.toLowerCase();
    var _search = search.toLowerCase();
    var start = 0, match, length = _search.length;
    while ((match = _string.indexOf(_search, start)) >= 0) {
      result.push(this.slice(start, match));
      start = match + length;
    }
    result.push(this.slice(start));
  } else {
    result = this.split(search);
  }
  return result.join(replace);
}

使用法:

alert('Bananas And Bran'.replaceAll('An', '(an)'));

1
実際、エスケープされたRegExはindexOfよりもパフォーマンスが良いようです。正しく聞こえませんが、JSperfはそれがはるかに高速であることを示しています。jsperf.com
indexof

たぶんそのコードを書いた当時は、jsperfを使用していませんでした。しかし、結局のところ、そのような議論はまったく無意味です。パフォーマンスの違いは、現実の世界でのコードの可読性に値するものではないため、私の答えは依然として有効です。
Fagner Brack 2014年

2
String.prototype.replaceAll = function(character,replaceChar){
    var word = this.valueOf();

    while(word.indexOf(character) != -1)
        word = word.replace(character,replaceChar);

    return word;
}

3
次のように指定すると、無限ループに陥ることはありませんreplaceAll('&', '&')。(確かにそれはOPの質問には
当てはまり

しかし、「&」が含まれている&ので、ループは置き換えるものが不足することはありません(そして文字列は成長し続けます)。私は今それを試しました、そしてそれは私のブラウザをロックしました...
9:46のAnentropic

2

replaceAllの別の実装を次に示します。それが誰かを助けることを願っています。

    String.prototype.replaceAll = function (stringToFind, stringToReplace) {
        if (stringToFind === stringToReplace) return this;
        var temp = this;
        var index = temp.indexOf(stringToFind);
        while (index != -1) {
            temp = temp.replace(stringToFind, stringToReplace);
            index = temp.indexOf(stringToFind);
        }
        return temp;
    };

次に、それを使用できます:

var myText = "私の名前はジョージ";
var newText = myText.replaceAll( "George"、 "Michael");


1
これは、大文字と小文字を区別しない検索/置換を処理しません。:それは、機能的に同等であるのでstring.split(stringToFind).join(stringToReplace)
sstur

0

例:すべての二重引用符( ")を単一引用符( ')に置き換えたい場合、コードは次のようになります。

var str= "\"Hello\""
var regex = new RegExp('"', 'g');
str = str.replace(regex, '\'');
console.log(str); // 'Hello'

0

@scriptoはもう少し簡潔にして、以下のようにしていますprototype

function strReplaceAll(s, stringToFind, stringToReplace) {
    if (stringToFind === stringToReplace) return s;
    for (let index = s.indexOf(stringToFind); index != -1; index = s.indexOf(stringToFind))
        s = s.replace(stringToFind, stringToReplace);
    return s;
}

積み上げ方は次のとおりです。http//jsperf.com/replace-vs-split-join-vs-replaceall/68


0
String.prototype.replaceAll = function (needle, replacement) {
    return this.replace(new RegExp(needle, 'g'), replacement);
};


-1

RegExp javasscriptオブジェクトを使用して、任意の文字列/文字のすべての出現を置き換えることができます。

これがコードです、

var mystring = 'okay.this.is.a.string';

var patt = new RegExp("\\.");

while(patt.test(mystring)){

  mystring  = mystring .replace(".","");

}

-5
var mystring = 'okay.this.is.a.string';
var myNewString = escapeHtml(mystring);

function escapeHtml(text) {
if('' !== text) {
    return text.replace(/&/g, "&")
               .replace(/&lt;/g, "<")
               .replace(/&gt;/g, ">")
               .replace(/\./g,' ')
               .replace(/&quot;/g, '"')
               .replace(/&#39/g, "'");
} 

HTMLをエスケープするには、次を使用しますcreateTextNode
Downgoat 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.