替换字符串的特定部分

时间:2013-05-01 15:30:30

标签: 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=并替换之后直到遇到&(第一个)或字符串结尾(如果没有)。

我会在找到我搜索的地方的索引之后使用正则表达式或仅使用常规搜索结合第一个&的索引吗?

5 个答案:

答案 0 :(得分:3)

这听起来非常适合正则表达式。正则表达式引擎针对在字符串中查找模式进行了优化,这正是我们在此目的所要做的。尝试使用search()等在本机JavaScript中复制它很可能会变慢。此外,正则表达式可能更容易理解:

/\bwid=([^&]*)/

将匹配wid=加上后续内容,直到下一个&,如果有的话。

例如,

result = subject.replace(/\bwid=([^&]*)/g, "wid=1234");

会将所有wid=<anything>替换为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

答案 1 :(得分:3)

我实际上是agree with Tim,正则表达式就是这里的方式。

然而,原因不是表现。这是代码清晰度。

正则表达式的强大之处在于它们的表现力:它们如何让您以清晰简洁的方式表达模式。 (当然,他们经常被滥用,因此the famous quote暗示他们总是一件坏事。)

在这种特殊情况下,使用indexOfsubstring最终比使用正则表达式快得多:

http://jsperf.com/replace-a-specific-part-of-a-string

作为一般规则,使用更通用的解决方案编写自定义为您的问题定制的特定逻辑几乎总是表现优异。你摆脱了不使用的功能包袱;这直接转化为更快的性能。 (请记住making code faster is the same as making it do less。)

在这种情况下,如果您确实需要根据此模式替换字符串的一部分的问题的半通用解决方案,您可以编写如下函数:

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);
}

这是相对可读的。但是,我实际上在这里推荐使用正则表达式方法,因为它很清楚,而且几乎肯定不是性能瓶颈。

(如果您正在解析数百万个字符串,这实际上是一个瓶颈,那就会改变一些事情。)

答案 2 :(得分:0)

正则表达式似乎是您最好的选择。假设字符串在a

a.replace(/wid=([^&]+)/,"wid=WHATEVER")

答案 3 :(得分:0)

考虑以下PowerShell通用正则表达式的示例。这将匹配所有至少包含1个字母和1个数字的字符串:

(?<=[?&]wid=)[^&]*

实施例

$Matches = @()
$String = 'http://ashleyfurniture.scene7.com/is/image/AshleyFurniture/B233-48-OPEN-SD?wid=640&hei=180&fit=fit&align=0,0&qlt=95&resMode=sharp2'
Write-Host start with 
write-host $String
Write-Host
Write-Host result string
$String -replace '(?<=[?&]wid=)[^&]*', 'NewValue'

产量

start with
http://ashleyfurniture.scene7.com/is/image/AshleyFurniture/B233-48-OPEN-SD?wid=640&hei=180&fit=fit&align=0,0&qlt=95&resMode=sharp2

result string
http://ashleyfurniture.scene7.com/is/image/AshleyFurniture/B233-48-OPEN-SD?wid=NewValue&hei=180&fit=fit&align=0,0&qlt=95&resMode=sharp2

摘要

通过使用(?<=[?&]wid=),您可以确保找到wid键/值集,无论它在查询字符串中的位置。

答案 4 :(得分:0)

您可以在'?'之后拆分查询字符串通过'&amp;'在数组(键,值)中,然后编辑它并替换你想要的任何内容。

像这样的东西

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'])

输出180

我认为这样的事情会比正则表达式更快。<​​/ p>