给出像这样的正则表达式:
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
答案 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。 更多的线条,但是当你回来以后更改代码时,还会留下更多的头发。