【问题标题】:Help with negative lookbehind in regular expressions帮助正则表达式中的负面回溯
【发布时间】:2009-07-15 21:34:41
【问题描述】:

我正在开发一个 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 之类的工具针对示例数据对其进行测试时,此 regex 效果很好。

编辑 2:添加了斜线,它实际上是存在的。

【问题讨论】:

  • “匹配”变量究竟从何而来?更准确地说,您是通过从内容中解析 URL 来获取它们的吗?该行之前的“匹配”是什么样的?
  • 您要替换域还是路径?正如您所说,您在 Regex Coach 中获得了预期的匹配,但没有获得预期的替换操作。
  • 哇,我所有的答案都是-1,没有任何反馈。

标签: .net regex lookbehind


【解决方案1】:

我会尝试第三个角度。

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

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

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

您得到的结果是因为只有您的 URL 的路径(您的匹配字符串)是 匹配的输入,并且您将其替换为 newDomain 变量。

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

【讨论】:

    【解决方案2】:

    一些想法:

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

    希望对你有所帮助。

    【讨论】:

      【解决方案3】:

      我会试试这个

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

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

      【讨论】:

      • 为什么投反对票?它不能解决问题,如果是,请解释原因?我们不是通灵调试器
      【解决方案4】:

      也许我遗漏了一些东西,但您是否应该使用负面的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 正则表达式引擎相比,您可能会遇到一些不同。

      【讨论】:

        【解决方案5】:

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

        即,滥用 perl 作为速记:

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

        【讨论】:

          猜你喜欢
          • 2012-12-06
          • 1970-01-01
          • 2017-08-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-26
          相关资源
          最近更新 更多