正则表达式替换问题,负向前瞻不符合预期

时间:2011-06-08 19:23:27

标签: regex

我正在尝试编写一些替换正则表达式,如果它尚不存在,会将区域设置代码插入到网址中。我使用负前瞻模式来实现下面显示的

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

所以我希望将所有内容与第一个正斜杠匹配,然后检查区域设置是否不存在。语言环境可以是我们网站中的“en”或通常的“en-GB”样式区域代码。目前,此模式将执行以下操作:

http://www.mywebsite.com/location/index.html =&gt; http://www.mywebsite.com/en/location/index.html http://www.mywebsite.com/en/location/index.html =&gt; http://www.mywebsite.com/en/en/location/index.html

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

所以第一个工作正常,但第二个匹配,即使我不想要它然后放入语言环境代码。

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

“我希望将所有内容与第一个正斜杠匹配,然后检查区域设置是否存在。”

(^http://.*?/)(?!en/|\w{2}\-\w{2}/)(?<path>.*?$)所做的事情与所有事情相符 在第一个正斜线上,前面有一个en

与第一个正斜杠匹配不同,如果en在它前面则失败。

正则表达式将始终尝试以最短的路径成功。即使它使用?不合情理,它实际上会一直持续到它满足锚点或条件尾随它。在这种情况下,它在前面找到了一个没有en的正斜杠:www.mywebsite.com/en/,这不是第一个正斜杠,它是第二个斜杠。

这是一个问题,它一直在发生,是未来需要注意的事项 因此,目标是限制它匹配第一个正斜杠:[^/]*/

答案 2 :(得分:0)

请改用此正则表达式:

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