2014-11-14 79 views
-1

我希望替换URL的一部分,就像正则表达式的Javascript替代不替代

"/wiki/home/de/wikihome.md".replace("/wiki/home/(..)/.*\.md ", "en"); 

为什么不这项工作(即返回/wiki/home/en/wikihome.md)。

它返回未修改的字符串。

如何正确地做到这一点?

+0

您是否确认要查找匹配项? – 2014-11-14 17:48:04

+0

你能检查你的正则表达式语法是否正确?它匹配你想要匹配的东西吗? http://regexpal.com/ – ochi 2014-11-14 17:48:46

+0

您正在将**字符串**传递给'.replace()',而不是[正则表达式](https://developer.mozilla.org/en-US/docs/Web/JavaScript的/指南/ Regular_Expressions)。 – 2014-11-14 17:49:59

回答

2

你必须通过regular expression,而不是一个字符串:

var result = "/wiki/home/de/wikihome.md".replace(/(\/wiki\/home)\/..\/(.*\.md)/, "$1/en/$2"); 
 
document.body.innerHTML = result;

由于.replace将取代整场比赛,你必须捕捉的部分你不不想更换,即de之前和之后的部件,并将其重新插入更换件中。

+0

只需返回“en” – 2014-11-14 17:59:36

+0

我向你保证它不会......在那里,我做了一个snipper。 – 2014-11-14 18:00:16

2

它返回修改后的字符串,因为字符串不匹配。试试这个:

var str = "/wiki/home/de/wikihome.md"; 
var res = str.replace(/(\/wiki\/home\/)(..)(.*\.md)/, "$1en$3"); 
console.log(res); // => "/wiki/home/en/wikihome.md" 
+0

您删除了搜索掩码中的最后一个斜杠。 – 2014-11-14 18:00:56

0

我相信你的问题是你使用的是字符串而不是RegExp对象。我将字符串转换为RegExp,方法是将"替换为/,然后使用\转义必要的字符(大多数为/)。

"/wiki/home/de/wikihome.md".replace(/\/wiki\/home\/(..)\/.*\.md/, "en"); 

见我的小提琴:http://jsfiddle.net/dd133pob/1/

对于未来的正则表达式的问题,http://regexpal.com/至少可以告诉你,如果你的正则表达式是给定的字符串匹配正确。

+0

使RegExp对象没有帮助 – 2014-11-14 18:10:00

-1

您可以使用组进行替换,但有一种更简单的方法。只需更换你想要的部分。

var out = "/wiki/home/de/wikihome.md".replace(/(\/wiki\/home\/)[\S]+(\/.*\.md)/, "$1en$2"); 

console.log(out); 

//easier 
out = "/wiki/home/de/wikihome.md".replace(/\/de\//, '/en/'); 

console.log(out); 

对于您确定正确的扩展名的情况。

out = "/wiki/home/de/wikihome.md".replace(/\/de\/([\S]*[.]md)/, '/en/$1'); 
console.log(out); 
+0

但是,这也会使/de/xxxx/xxx.jpg成为/en/xxxx/xxx.jpg – 2014-11-14 18:09:19

+0

@RuedigerJungbeck这是真的。你期望这种模式显示出来吗? – 2014-11-14 18:11:58