使用带有正则表达式的string.replace时出现问题

时间:2014-02-04 01:09:06

标签: javascript regex

给出像这样的正则表达式:

http://rubular.com/r/ai1LFT5jvK

我想使用string.replace将“subdir”替换为我选择的字符串。

执行myStr.replace(/^.*\/\/.*\.net\/.*\/(.*)\/.*\z/,otherStr)

只返回相同的字符串,如下所示:http://jsfiddle.net/nLmbV/

如果您查看Rublar,它似乎捕获了我想要捕获的内容,但在小提琴上,它不会取代它。

我想知道为什么会这样,以及我做错了什么。正确的正则表达式或replace调用的正确实现会很好,但最重要的是,我想了解我做错了什么,以便将来可以避免它。

修改

我已经更新了小提琴来改变我的正则表达式:

/^.*\/\/.*\.net\/.*\/(.*)\/.*\z/

 /^.*\/\/.*\.net\/.*\/(.*)\/.*$/

根据小提琴,它只返回hello而不是https://xxxxxxxxxxx.cloudfront.net/dir/hello/Slide1_v2.PNG

2 个答案:

答案 0 :(得分:2)

你的正则表达式中\z很少。

您可能忘了用$符号替换它。 JavaScript使用^$作为锚点,而Ruby使用\A\z


回答你的编辑:

匹配总是被替换为整体。您想要将待替换部分的左侧和右侧分组,并将其重新插入替换部分:

url.replace(/^(.*\/\/.*\.net\/.*\/).*(\/.*)$/,"$1hello$2")

答案 1 :(得分:1)

在我被标记下来之前,我知道问题是关于regexp。在没有编写极其复​​杂的正则表达式的情况下,使用regexp几乎无法可靠地处理此答案URL的原因。它可以做到,但它让你头疼! 如果您在浏览器中执行此操作,则可以在脚本中使用A标记来简化操作。 A标签知道如何将它们分解成碎片,并且它允许您独立地修改碎片,因此您只需要处理路径名:

//make a temporary a tag
var a = document.createElement('a');
//set the href property to the url you want to process
a.href = "scheme://host.domain/path/to/the/file?querystring"
//grab the path part of the url, and chop up into an array of directories
var dirs = a.pathname.split('/');
//set 2nd dir name - array is ['','path','to','file']
dirs[2]='hello';
//put the path back together
a.pathname = dirs.join('/');

a.href现在包含您想要的URL。 更多的线条,但是当你回来以后更改代码时,还会留下更多的头发。