.
JavaScript文字列内のすべてのドット()を置き換えたい
たとえば、私は:
var mystring = 'okay.this.is.a.string';
取得したい:okay this is a string
。
これまでのところ、私は試しました:
mystring.replace(/./g,' ')
しかし、これはすべての文字列がスペースに置き換えられることになります。
.
JavaScript文字列内のすべてのドット()を置き換えたい
たとえば、私は:
var mystring = 'okay.this.is.a.string';
取得したい:okay this is a string
。
これまでのところ、私は試しました:
mystring.replace(/./g,' ')
しかし、これはすべての文字列がスペースに置き換えられることになります。
回答:
.
正規表現では「任意の文字」の意味があるため、エスケープする必要があります。
mystring = mystring.replace(/\./g,' ')
g
が、式の最後の修飾子が使用される目的です。(g)loballyと考えてください。
理解しやすいもう1つのソリューション:)
var newstring = mystring.split('.').join(' ');
/**
* 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(' ');
str.toLowerCase()
パフォーマンス上の理由から、ループの外に移動する必要があります。また、検索している文字列を操作することは、おそらく最適とは言えません。:私は修正されたバージョンで答えを投稿stackoverflow.com/questions/2390789/...
ドットに2つのバックスラッシュを追加して機能させます。乾杯。
var st = "okay.this.is.a.string";
var Re = new RegExp("\\.","g");
st = st.replace(Re," ");
alert(st);
これはより簡潔/読みやすく、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)'));
String.prototype.replaceAll = function(character,replaceChar){
var word = this.valueOf();
while(word.indexOf(character) != -1)
word = word.replace(character,replaceChar);
return word;
}
replaceAll('&', '&')
。(確かにそれはOPの質問には
&
ので、ループは置き換えるものが不足することはありません(そして文字列は成長し続けます)。私は今それを試しました、そしてそれは私のブラウザをロックしました...
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");
string.split(stringToFind).join(stringToReplace)
@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
var mystring = 'okay.this.is.a.string';
var myNewString = escapeHtml(mystring);
function escapeHtml(text) {
if('' !== text) {
return text.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">")
.replace(/\./g,' ')
.replace(/"/g, '"')
.replace(/'/g, "'");
}
createTextNode