2011-06-08 77 views
0

我想写一些替换正则表达式,它会插入一个语言环境代码到一个URL中,如果它不存在。我USIG负先行模式本图所示正则表达式替换问题,负向前视行为不如预期

(^http://.*?/)(?!en/|\w{2}\-\w{2}/)(?<path>.*?$) 

所以我想一切都匹配的第一个正斜杠,然后检查区域设置不存在实现的。区域设置可以是'en',也可以是我们网站中常用的'en-GB'样式区域代码。目前,这种格局将做到以下几点:

http://www.mywebsite.com/location/index.html =>http://www.mywebsite.com/en/location/index.html http://www.mywebsite.com/en/location/index.html =>http://www.mywebsite.com/en/en/location/index.html

使用以下替换模式:$ 1EN/$ {path}

所以第一个工作正常,但第二个匹配,即使我不想要它,然后放置区域代码。

是我想做的事情,听起来应该是这样。感谢您提前提供任何帮助。

+0

你使用什么编程语言/正则表达式? 。净? – 2011-06-08 19:53:56

回答

1

尝试用[^/]*替换第一个.*?

例如: ^(http://[^/\s]*/)(?!en/|\w{2}-\w{2}/)(?<path>\S*)$

0

使用正则表达式来代替:

^(http://[^\/]+/)(?!en/|\w{2}\-\w{2}/)(?<path>.*)$ 
+0

是不是意味着在任何一端都加上〜,如果你这么做似乎不起作用 – 2011-06-09 07:58:55

+0

〜只能用作正则表达式的分隔符,如果你想,我可以告诉你一个关于ideone的工作代码演示。 – anubhava 2011-06-09 11:54:02

+0

编辑我的答案,以消除混淆'〜'(我用于我的测试)。 – anubhava 2011-06-09 13:03:09

1

“我想匹配的一切到第一个斜杠,然后检查区域设置不存在。”

这是什么(^http://.*?/)(?!en/|\w{2}\-\w{2}/)(?<path>.*?$)确实是匹配的一切行动
到doesent在它前面有一个en第一个正斜杠。

它与匹配到第一个正斜杠不同,然后在en位于其前面时失败。

正则表达式将总是试图成功接受最短路径。即使它使用“?”不明朗,它实际上会一直持续下去,直到它满足跟随它的锚点或条件。在这种情况下,它在前面发现没有en的正斜杠:www.mywebsite.com/en/,这不是第一个正斜杠,它是第二个正斜杠。

这是一个疑难杂症,它始终在发生,并且是值得注意的未来。
所以我们的目标是限制它匹配第一个正斜杠:[^/]*/

+0

感谢您对这个问题的真正详细的解释,我将不得不为未来记住这一点。 – 2011-06-09 06:49:06