-2

我正在研究一个 ASP.NET 响应过滤器,它在特定情况下重写 URL 以指向不同的域。

因为 ASP.NET 将响应写入分块,所以在页面完全流式传输之前,我的过滤器会被调用多次。这意味着我需要注意每次对 Regex.Replace 的调用都不会双重替换 url(你最终会得到http://foo.comhttp://foo.com/path)。

为此,我尝试对替换使用否定的后向表达式,但它似乎不起作用:

    content = Regex.Replace(content,"((?<!" + newDomain + ")" + match + ")", newDomain + match); 

这将创建一个正则表达式,如:

 ((?<!http://www.foo.com/)actual/url)

然而,它似乎不尊重后面的样子,我把所有东西都换了。

有任何想法吗?

编辑:当我使用像 Regex Coach 这样的工具对样本数据进行测试时,这个正则表达式效果很好。

编辑2:添加了斜线,它实际上就在那里。

4

5 回答 5

2

我会尝试第三个角度。

我认为您混淆了您的正则表达式“匹配”正则表达式教练中的某些内容的事实,它与您想要的部分相匹配。因此,您对替换结果感到惊讶。

替换为新令牌交换所有匹配的输入。

否定的lookbehind确保模式不存在,但模式不是匹配输入的一部分。

你得到的结果是因为只有你的 URL 的路径(你的匹配字符串)是匹配的输入,你用 newDomain 变量替换它。

这就是为什么你得到你正在得到的结果。

于 2009-07-16T22:07:00.013 回答
1

几个想法:

  • 你需要逃避 . 在正则表达式中?我不知道<!语法,也没有手头的书,所以这可能是一个有争议的问题。
  • 我看不出它如何匹配http://www.foo.com/something因为在您的示例中 www.foo.com 之后没有 / 。

希望其中一些有所帮助。

于 2009-07-15T21:49:12.170 回答
0

也许我遗漏了一些东西,但是您是否应该使用负面的lookbehinds?从本质上讲,向后看不会匹配任何东西。而您想要匹配域和路径,然后替换域。正确的?

所以它应该更像这样:

Regex.Replace("http://www.foo.com/something", "(http://www.foo.com/)(something)", "http://www.abc.com/$2")

这个想法是利用分组来发挥你的优势。这就是 $2 部分将抓取匹配的后半部分(路径)并将其附加到新域的地方。我在Regex Hero(一个 .NET 正则表达式测试器)中对此进行了测试,它可以工作。顺便说一句,Regex Coach 是基于 Perl 的,与 .NET regex 引擎相比,您可能会遇到一些不同。

于 2009-07-15T22:52:59.857 回答
0

我会试试这个

content = Regex.Replace(content,"(?<!" + newDomain + ")^[^/]+/(?=" + match + ")", newDomain + match);

这将匹配(并因此替换表达式上的域部分)只有域不是 newDomain 并且路径匹配。

于 2009-07-15T22:38:54.177 回答
0

当您在字符串中找不到要替换的域部分时,仅替换它的想法怎么样?

即,滥用 perl 作为速记:

if ($string !~ /foo\.com) {
  $string = $domain . $string;
}
于 2011-10-07T09:24:18.027 回答