1

假设以下 URL:http://a2.mzstatic.com/us/ryoyo0/078/Purple100x100/v4/38/e3/b4/38e3b4a2-b422-8d1e-69f2-593fc035c9d4/mzl.vqhwzhhc.100x100-75.jpg

我们想用 256x256 替换最后出现的 100x100。URL 应为:

http://a2.mzstatic.com/us/ryoyo0/078/Purple100x100/v4/38/e3/b4/38e3b4a2-b422-8d1e-69f2-593fc035c9d4/mzl.vqhwzhhc.256x256-75.jpg

这是我们的 JavaScript 替换方法:

replace( /100x100(?!100x100)/, '256x256' )

不幸的是,我们总是替换第一个,而不是最后一个。

我们做错了什么?

谢谢!

4

4 回答 4

4

试试这个:replace( /100x100(?!.*100x100)/, '256x256' )

.*在 . 的第一次出现和最后一次出现之间添加额外字符的帐户100x100

注意- 虽然我的回答描述了您在模式中做错了什么以及如何解决它,但 Billy Moon 提供的答案可能是您似乎正在尝试做的更好的模式。

于 2013-03-12T21:28:09.480 回答
3

另一种方法...

replace( /(.*)100x100/, '$1256x256' )

作品由...

  1. 100x100用 , 尽可能贪婪地捕获所有内容到第(.*)1 组
  2. 匹配的100x100
  3. 将其替换为捕获的组 1,通过使用$1然后添加256x256代替未捕获的匹配

注意此方法仅适用于最后一场比赛(或者如果您通过?.*

出于性能原因、为了与各种正则表达式实现的兼容性以及我相信为了可读性,避免使用环视断言通常是好的。

编辑:测试脚本

var url = "http://a2.mzstatic.com/us/ryoyo0/078/Purple100x100/v4/38/e3/b4/38e3b4a2-b422-8d1e-69f2-593fc035c9d4/mzl.vqhwzhhc.100x100-75.jpg"

console.log(url.replace(/(.*)100x100/, '$1256x256'))

// OUTPUT:
// http://a2.mzstatic.com/us/ryoyo0/078/Purple100x100/v4/38/e3/b4/38e3b4a2-b422-8d1e-69f2-593fc035c9d4/mzl.vqhwzhhc.256x256-75.jpg
于 2013-03-12T21:33:45.317 回答
0

你也可以改变你的负前瞻来寻找斜线。由于第二次出现以句点而不是斜线结尾,应该可以解决它。

/100x100(?!\/)/
于 2013-03-12T21:30:53.863 回答
0

另一种方法,由于可能被误解的意图,它只替换100x100s 出现在 url 的文件名部分(没有/出现在字符串之后)中。

replace(/100x100([^\/]*)$/, '256x256$1')

作品由...

  1. 匹配100x100
  2. ...然后捕获到第 1 组,零个或多个,而不是正斜杠,与([^\/]*)
  3. ...后跟字符串的结尾,$
  4. 替换256x256为第一个捕获组,$1

如果字符串中最后一个之后没有匹配/项,则不进行替换。

注意我检查了这个答案、我的另一个答案和@Daedalus 的答案的速度,虽然我通常希望避免断言来加速正则表达式,但在这种情况下,我发现它们的速度都是相同的,并且非常快,在我的电脑上每秒运行几十万次。

于 2013-03-13T06:50:59.133 回答