Javascript 替换字符串的特定部分
有很多方法可以搜索字符串并用其他内容替换某个部分,但我想知道哪种方法是最好的 以这个字符串为例:Javascript 替换字符串的特定部分,javascript,regex,replace,Javascript,Regex,Replace,有很多方法可以搜索字符串并用其他内容替换某个部分,但我想知道哪种方法是最好的 以这个字符串为例: http://ashleyfurniture.scene7.com/is/image/AshleyFurniture/B233-48-OPEN-SD?wid=640&hei=180&fit=fit&align=0,0&qlt=95&resMode=sharp2 假设我想搜索wid=并替换后面的内容,直到遇到&(第一个)或字符串的结尾(如果没有) 我会使用正则表达式还是只使用常规搜索,并结合在我找到要
http://ashleyfurniture.scene7.com/is/image/AshleyFurniture/B233-48-OPEN-SD?wid=640&hei=180&fit=fit&align=0,0&qlt=95&resMode=sharp2
假设我想搜索wid=
并替换后面的内容,直到遇到&
(第一个)或字符串的结尾(如果没有)
我会使用正则表达式还是只使用常规搜索,并结合在我找到要搜索内容的位置的索引之后的第一个
&
的索引?这听起来非常适合正则表达式。正则表达式引擎是为查找字符串中的模式而优化的,这正是我们的目标。尝试用search()
等在本机JavaScript中复制它很可能会慢一些。此外,正则表达式可能更容易理解:
/\bwid=([^&]*)/
将匹配wid=
加上后面的内容,直到下一个&
,如果有
比如说,
result = subject.replace(/\bwid=([^&]*)/g, "wid=1234");
将所有wid=
替换为wid=1234
说明:
\b # Start at a word boundary (so we don't match "rowid=" etc.)
wid= # Match wid=
( # Match and capture (for later re-use, if necessary):
[^&]* # Zero or more characters (any character except &)
) # End of capturing group
正则表达式似乎是你最好的选择。假设字符串在
a
中
a.replace(/wid=([^&]+)/,"wid=WHATEVER")
考虑以下通用正则表达式的powershell示例。这将匹配至少有1个字母和1个数字的所有字符串:
(?您可以在数组(键、值)中将“?”后面的查询字符串按“&”拆分,然后编辑它并替换所需内容
像这样的
var url = 'http://ashleyfurniture.scene7.com/is/image/AshleyFurniture/B233-48-OPEN-SD?wid=640&hei=180&fit=fit&align=0,0&qlt=95&resMode=sharp2'
var x = url.split("?");
var query = x[1];
var x2 = query.split("&");
var length = x2.length,
element = null;
for (var i = 0; i < length; i++) {
x3 = x2[i].split('=');
res[x3[0]] = x3[1]
}
console.log(res['hei'])
var url='1〕http://ashleyfurniture.scene7.com/is/image/AshleyFurniture/B233-48-OPEN-SD?wid=640&hei=180&fit=fit&align=0,0&qlt=95&resMode=sharp2'
var x=url.split(“?”);
var query=x[1];
var x2=查询。拆分(&);
变量长度=x2.5长度,
元素=空;
对于(变量i=0;i
产出180
我认为这样的东西会比正则表达式快。事实上,正则表达式是实现这一点的方法
然而,原因不是性能。是代码清晰
正则表达式的威力在于其表达能力:它们如何让您以清晰简洁的方式表达模式(当然,它们经常被严重滥用,因此意味着它们永远是一件坏事)
在这种特殊情况下,使用索引of
和子字符串
比使用正则表达式快得多:
一般来说,编写针对您的问题定制的特定逻辑几乎总是优于使用更通用的解决方案。您摆脱了不使用的功能包袱;这直接转化为更快的性能。(请记住。)
在这种情况下,如果您确实想要根据此模式替换字符串的一部分的问题的半通用解决方案,则可以编写如下函数:
function replaceBetween(haystack, left, right, replacement) {
var indexLeft = haystack.indexOf(left);
var indexRight = haystack.indexOf(right, indexLeft + left.length);
return haystack.substring(0, indexLeft) + replacement + haystack.substring(indexRight);
}
这是相对可读的。然而,我实际上再次推荐正则表达式方法,因为它很清楚,而且几乎肯定不是性能瓶颈
(如果你正在解析数百万个字符串,而这实际上是一个瓶颈,这会改变一切。)我还可以用.search()获得一个参数,说明为什么使用regex而不是其他方法吗
?@Roland:当然可以;我在第一段中添加了一行。我明白了,这听起来是一个合理的论点,我所关心的是速度,因为这个过程可能会在数百个主题上完成。小心!你可能期望正则表达式引擎比更手动的方法更快;但事实并非如此。请看我的答案,特别是这个jsPerf结果:作为一个例子n边缘情况此解决方案将防止意外匹配键,如“&name wid=value”如果您使用\b单词边界选项如果您渴望找到最快的方法,这是一个很好的实验场所。+1:这一点很好,但比较并不完全公平;我的正则表达式包含一个JavaScript实现忽略的单词边界断言。因此,您需要再次检查“仅当前一个字符不是字母数字时才匹配wid=
";这可能不会使结果偏向正则表达式解决方案,但值得一提。@TimPietzcker:你说得对,这是值得一提的。为了简洁起见,我跳过了这一部分……我现在意识到这是一个愚蠢的决定,因为包括它实际上会强化我关于正则表达式的表达能力的观点。也许我会补充一下现在。
var url = 'http://ashleyfurniture.scene7.com/is/image/AshleyFurniture/B233-48-OPEN-SD?wid=640&hei=180&fit=fit&align=0,0&qlt=95&resMode=sharp2'
var x = url.split("?");
var query = x[1];
var x2 = query.split("&");
var length = x2.length,
element = null;
for (var i = 0; i < length; i++) {
x3 = x2[i].split('=');
res[x3[0]] = x3[1]
}
console.log(res['hei'])
function replaceBetween(haystack, left, right, replacement) {
var indexLeft = haystack.indexOf(left);
var indexRight = haystack.indexOf(right, indexLeft + left.length);
return haystack.substring(0, indexLeft) + replacement + haystack.substring(indexRight);
}