4

有很多方法可以搜索字符串并用其他内容替换某个部分,但我想要一些输入,哪些是最好的方法。

以这个字符串为例:

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

我会使用正则表达式还是只使用常规搜索与&我找到我正在搜索的地方的索引之后的第一个索引相结合?

4

5 回答 5

3

我实际上同意蒂姆的观点,即正则表达式是这里的方法。

但是,原因不是性能。这是代码的清晰度。

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

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

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

作为一般规则,编写针对您的问题定制的特定逻辑几乎总是会优于使用更通用的解决方案。您摆脱了不使用的功能的包袱;这直接转化为更快的性能。(请记住,使代码更快与减少代码相同。)

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

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

这是相对可读的。不过,我这里其实还是推荐正则表达式的方式,因为它很清楚,而且几乎可以肯定不是性能瓶颈。

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

于 2013-05-01T16:36:49.647 回答
3

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

/\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
于 2013-05-01T15:32:12.813 回答
0

您可以在“?”之后拆分查询字符串 通过数组(键,值)中的“&”,然后对其进行编辑并替换您想要的任何内容。

像这样的东西

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

我认为这样的事情会比正则表达式更快。

于 2013-05-01T15:40:45.727 回答
0

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

a.replace(/wid=([^&]+)/,"wid=WHATEVER")
于 2013-05-01T15:33:30.827 回答
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 键/值集,而不管它在查询字符串中的什么位置。

于 2013-05-01T15:38:12.007 回答