如何使用 JavaScript 替换字符串中的所有点
Posted
技术标签:
【中文标题】如何使用 JavaScript 替换字符串中的所有点【英文标题】:How to replace all dots in a string using JavaScript 【发布时间】:2011-01-24 08:23:52 【问题描述】:我想替换 javascript 字符串中所有出现的点 (.
)
例如,我有:
var mystring = 'okay.this.is.a.string';
我想得到:okay this is a string
。
到目前为止我尝试过:
mystring.replace(/./g,' ')
但这最终会将所有字符串替换为空格。
【问题讨论】:
aefxx 的答案是正确的,但正如仅供参考一样,正则表达式中的句点字符意味着匹配 一切,因此一切都是空格。用反斜杠转义它意味着匹配句点。 感谢您的提示。我有一些使用 Regex 的 AHA 时刻(在构建应用程序时)。我真的很讨厌它_,你有一些很酷的好教程吗? rubular.com 就是您要找的东西 Don't use a regex 为这个微不足道的事情。 不幸的是,看起来非正则表达式不允许多次替换字符串。 【参考方案1】:让 a = "曾经有一个国王。传播运算符。让。版本。常量。";
让 data = a.replaceAll(".","");
答案:data = "曾经有一个king spread operator let ver const";
您需要对该字符串使用 replaceAll() 方法。
【讨论】:
【参考方案2】:replaceAll(search, replaceWith)
[MDN]
".a.b.c.".replaceAll('.', ' ')
// result: " a b c "
// Using RegEx. You MUST use a global RegEx.
".a.b.c.".replaceAll(/\./g, ' ')
// result: " a b c "
replaceAll()
将所有出现的search
替换为replaceWith
。
这实际上与使用带有全局正则表达式(*)的replace()
[MDN] 相同,只是replaceAll()
在我看来更具可读性。
(*) 表示它将匹配所有匹配项。
如果您选择正则表达式,则重要(!):
当使用
regexp
时,您必须设置全局 ("g") 标志; 否则,它会抛出一个 TypeError: "replaceAll must be called with 一个全局正则表达式”。
【讨论】:
我比最佳答案更喜欢这个,因为它基本相同但更简单,因为它表明您不必为这么简单的事情使用正则表达式。 (我不确定为什么大多数答案都假设您需要使用正则表达式) 重要的是要考虑与旧浏览器的兼容性。我在生产中使用它,因此不得不使用 RegEx 或split('.').join('')
将其更改为 replace
。【参考方案3】:
最简单的方法
"Mr.".split('.').join("");
.......
控制台
【讨论】:
【参考方案4】:mystring.replace(new RegExp('.', "g"), ' ');
【讨论】:
【参考方案5】:您需要对.
进行转义,因为它在正则表达式中具有“任意字符”的含义。
mystring = mystring.replace(/\./g,' ')
【讨论】:
只是为了澄清, \ 转义正则表达式中的特殊字符,如 .在这种情况下 看起来像 sed.. 不知何故.. :) 在 reagukar 表达式中的点。意味着一切,这是正确的解决方案! @Kingalione 究竟什么不起作用?你能详细说明一下吗? @Webwoman 这就是表达式末尾的g
修饰符的用途。将其视为(g)全局。【参考方案6】:
String.prototype.replaceAll = function (needle, replacement)
return this.replace(new RegExp(needle, 'g'), replacement);
;
【讨论】:
【参考方案7】:/**
* 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: 我创建了一个库,允许您使用流畅的界面执行此操作:
replace('.').from('okay.this.is.a.string').with(' ');
见https://github.com/FagnerMartinsBrack/str-replace。
【讨论】:
非常有用。仅供参考:警报语句中的分号后面有流氓字符。 “流氓角色”是什么意思? 他的意思是实体 & #8203 ;两次,即 Unicode 字符“零宽度空间”(U+200B)。更多信息fileformat.info/info/unicode/char/200b/index.htm @FagnerBrack 出于性能原因,您可能应该将str.toLowerCase()
移出循环。此外,操作您正在搜索的字符串可能不是最佳的。我发布了一个修改版本的答案:***.com/questions/2390789/…
@sstur 我想在操作后需要再次小写字符串。操纵我正在搜索的字符串是否在性能上有很大差异?我想易读性超过了好处(未经测试)。【参考方案8】:
@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
【讨论】:
【参考方案9】:您可以使用 RegExp javasscript 对象替换所有出现的任何字符串/字符。
这是代码,
var mystring = 'okay.this.is.a.string';
var patt = new RegExp("\\.");
while(patt.test(mystring))
mystring = mystring .replace(".","");
【讨论】:
【参考方案10】:例子:我想把所有双引号(")都换成单引号(') 那么代码会是这样的
var str= "\"Hello\""
var regex = new RegExp('"', 'g');
str = str.replace(regex, '\'');
console.log(str); // 'Hello'
【讨论】:
【参考方案11】:对于这个简单的场景,我还建议使用内置在 javascript 中的方法。
你可以试试这个:
"okay.this.is.a.string".split(".").join("")
问候
【讨论】:
【参考方案12】: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, "'");
【讨论】:
要转义 HTML,请使用createTextNode
【参考方案13】:
这更简洁/可读,并且应该比 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)'));
【讨论】:
实际上,转义的 RegEx 似乎比 indexOf 执行得更好!听起来不对,但 JSPerf 表明它更快:jsperf.com/replaceall-indexof-vs-regex 也许当时我没有使用 jsperf。但最终这样的讨论是完全没有意义的,性能差异不值得代码在现实世界中的易读性,所以我的回答仍然有效。【参考方案14】:这里是 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)
【参考方案15】:
String.prototype.replaceAll = function(character,replaceChar)
var word = this.valueOf();
while(word.indexOf(character) != -1)
word = word.replace(character,replaceChar);
return word;
【讨论】:
如果你给它这样的东西,它不会陷入无限循环:replaceAll('&', '&amp;')
吗? (诚然,这不是 OP 的问题)
但是“&”包含一个&
,因此循环永远不会用完要替换的东西(并且字符串会不断增长)。我刚才试了一下,它锁定了我的浏览器......【参考方案16】:
另一种易于理解的解决方案:)
var newstring = mystring.split('.').join(' ');
【讨论】:
@HaggleLad 因为你不需要弄乱正则表达式 这不是比正则表达式慢很多吗? @Jasper 据我了解,它实际上在大多数浏览器中都更快,尽管我自己并没有实际对其进行基准测试。 @BetoFrega 没有什么比一些经验数据更能说明你的情况了:)。感谢您提供链接! 如果您使用正则表达式,您确实希望将正则表达式存储在循环外的单独变量中。编译/解释一个正则表达式需要一些时间,但是一旦它被编译,它可以很快被使用。请尝试我所做的这些测试:jsperf.com/replace-vs-split-join-vs-replaceall/23【参考方案17】:我在点上添加双反斜杠以使其工作。加油。
var st = "okay.this.is.a.string";
var Re = new RegExp("\\.","g");
st = st.replace(Re," ");
alert(st);
【讨论】:
【参考方案18】:str.replace(new RegExp(".","gm")," ")
【讨论】:
非常适合替换功能 =)以上是关于如何使用 JavaScript 替换字符串中的所有点的主要内容,如果未能解决你的问题,请参考以下文章