在没有正则表达式的情况下替换所有内容,我可以在哪里使用 G
Replace all without a regex where can I use the G
所以我有以下内容:
var token = '[token]';
var tokenValue = 'elephant';
var string = 'i have a beautiful [token] and i sold my [token]';
string = string.replace(token, tokenValue);
以上内容只会替换第一个[token]
,而不管第二个。
如果我使用正则表达式,我可以像这样使用它
string = string.replace(/[token]/g, tokenValue);
这将取代我所有的[tokens]
但是我不知道如何在不使用//
的情况下做到这一点
我发现拆分/连接在大多数情况下都足够令人满意。一个现实生活中的例子:
myText.split("'n").join('<br>');
为什么每次出现令牌时都用 do while 循环替换令牌?
var index = 0;
do {
string = string.replace(token, tokenValue);
} while((index = string.indexOf(token, index + 1)) > -1);
string = string.replace(new RegExp("''[token'']","g"), tokenValue);
注意接受
的答案,replaceWith 字符串可以包含 inToReplace 字符串,在这种情况下将有一个无限循环......
这里有一个更好的版本:
function replaceSubstring(inSource, inToReplace, inReplaceWith)
{
var outString = [];
var repLen = inToReplace.length;
while (true)
{
var idx = inSource.indexOf(inToReplace);
if (idx == -1)
{
outString.push(inSource);
break;
}
outString.push(inSource.substring(0, idx))
outString.push(inReplaceWith);
inSource = inSource.substring(idx + repLen);
}
return outString.join("");
}
不幸的是,
由于 Javascript 的字符串replace()
函数不允许你从特定的索引开始,并且没有办法对字符串进行就地修改,所以很难像在更理智的语言中那样有效地做到这一点。
-
.split().join()
不是一个好的解决方案,因为它涉及创建字符串负载(尽管我怀疑 V8 做了一些黑暗魔法来优化这一点(。 - 在循环中调用
replace()
是一个糟糕的解决方案,因为 replace 每次都从字符串的开头开始搜索。这将导致 O(N^2( 行为!它还存在无限循环的问题,如此处的答案中所述。 - 如果您的替换字符串是编译时常量,则正则表达式可能是最好的解决方案,但如果不是,那么您就不能真正使用它。您绝对不应该尝试通过转义将任意字符串转换为正则表达式。
一种合理的方法是使用适当的替换来构建一个新字符串:
function replaceAll(input: string, from: string, to: string): string {
const fromLen = from.length;
let output = "";
let pos = 0;
for (;;) {
let matchPos = input.indexOf(from, pos);
if (matchPos === -1) {
output += input.slice(pos);
break;
}
output += input.slice(pos, matchPos);
output += to;
pos = matchPos + fromLen;
}
return output;
}
我将其与所有其他解决方案进行了基准测试(除了在循环中调用replace()
,这将是可怕的(,它比正则表达式略快,大约是 split
/join
的两倍。
编辑:这几乎与Stefan Steiger的答案相同,由于某种原因我完全错过了。然而,由于某种原因,他的回答仍然使用 .join()
,这使得它比我的慢 4 倍。
"[.token.*] nonsense and [.token.*] more nonsense".replace("[.token.*]", "some", "g");
将产生:
"有些废话,还有一些废话">
我意识到@TheBestGuest的答案不适用于以下示例,因为您最终会陷入无限循环:
var stringSample= 'CIC';
var index = 0;
do { stringSample = stringSample.replace('C', 'CC'); }
while((index = stringSample.indexOf('C', index + 1)) > -1);
因此,这是我对用TypeScript编写的replaceAll方法的建议:
let matchString = 'CIC';
let searchValueString= 'C';
let replacementString ='CC';
matchString = matchString.split(searchValueString).join(replacementString);
console.log(matchString);
相关文章:
- 我可以在json对象中添加一个函数吗
- 在Redux中,我应该在哪里编写复杂的异步流
- 我可以在Javascript/jQuery中使用一个变量作为键吗
- JavaScript-为什么我可以在数组中设置键
- 我可以在Nodewebkit中保护javascript以外的资源吗
- 为什么我可以在Array属性对象中找到Javascript Array for Each方法
- AJAX更新面板不;t工作.请帮我找出我错在哪里.
- 我可以在网页正文中插入文本链接吗
- 我可以在不连接按钮的情况下以角度方式使用zclip吗
- 我可以在FullCalendar中设置事件ClickLimit弹出窗口的样式吗
- 我可以在不使用乘法运算符“”的情况下进行乘法运算吗*"在JavaScript中
- 在上传之前,我可以在代码中的哪里将文件扩展名更改为小写
- 我可以在哪里协作处理JavaScript,类似于CodeHS
- 我可以在哪里存储受保护的URL
- 我可以在哪里放置我的Javascript模式定义
- 在没有正则表达式的情况下替换所有内容,我可以在哪里使用 G
- 我可以在哪里下载eclipse的基本服务器配置
- 增量加载网页:我可以在哪里放:$("#LoadingImage"). hide ();
- jQuery可以改变页面-但是我如何/在哪里获得更改
- 我可以在哪里下载独立的微软脚本编辑器