我正在开发一个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:添加了斜杠,它实际上就在那里。
答案 0 :(得分:2)
我会尝试第三个角度。
我认为你混淆了这个事实,你的正则表达式“匹配”正则表达式教练的东西,它与你想要的部分相匹配。因此,您对替换结果感到惊讶。
替换为新令牌交换所有匹配的输入。
负面的后视图确保模式不存在,但模式不是匹配输入的一部分。
您获得的结果是因为只有您网址的路径(您的匹配字符串)是匹配的输入,而您将使用newDomain变量替换它。
这就是为什么你得到的结果。
答案 1 :(得分:1)
有几点想法:
<!
语法,也没有我的书,所以这可能是一个没有实际意义的点。希望其中一些有用。
答案 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;
}