帮助正则表达式中的负向lookbehind

时间:2009-07-15 21:34:41

标签: .net regex lookbehind

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

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

要做到这一点,我正在尝试使用负面的lookbehind表达式替换,但它似乎不起作用:

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

这会创建一个正则表达式:

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

然而,它似乎不尊重背后的外观,我将所有东西都取代了。

有什么想法吗?

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

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

5 个答案:

答案 0 :(得分:2)

我会尝试第三个角度。

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

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

负面的后视图确保模式不存在,但模式不是匹配输入的一部分。

您获得的结果是因为只有您网址的路径(您的匹配字符串)是匹配的输入,而您将使用newDomain变量替换它。

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

答案 1 :(得分:1)

有几点想法:

  • 你需要逃避吗?在正则表达式?我不知道<!语法,也没有我的书,所以这可能是一个没有实际意义的点。
  • 我看不出它与http://www.foo.com/something的匹配程度,因为在你的例子中没有/在www.foo.com之后。

希望其中一些有用。

答案 2 :(得分:0)

我会尝试这个

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

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

答案 3 :(得分:0)

也许我错过了一些东西,但是你应该使用负面的背景吗?从本质上讲,一个外观无法与任何东西相提并论。而您希望匹配域和路径,然后替换域。正确?

所以它应该是更像这样的东西:

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

这个想法是为了你的优势使用分组。这就是$ 2部分将抓住比赛的后半部分(路径)并将其附加到新域。我在Regex Hero(.NET正则表达式测试器)中对此进行了测试,并且它可以正常工作。顺便说一下,The Regex Coach是基于Perl的,与.NET正则表达式引擎相比,你可能会遇到一些不同。

答案 4 :(得分:0)

当你在字符串中找不到要替换的域部分时,如何只替换它?

即将滥用perl作为速记:

if ($string !~ /foo\.com) {
  $string = $domain . $string;
}