【问题标题】:Regex implementation正则表达式实现
【发布时间】:2009-12-04 17:59:39
【问题描述】:

我遇到了这段代码,它应该在动态(重写)url 的层次结构中确定父 url。基本逻辑是这样的:

"/testing/parent/default.aspx"  --> "/testing/default.aspx"
"/testing/parent.aspx"          --> "/testing/default.aspx"
"/testing/default.aspx"         --> "/default.aspx"
"/default.aspx"                 --> null

...

private string GetParentUrl(string url)
{
    string parentUrl = url;

    if (parentUrl.EndsWith("Default.aspx", StringComparison.OrdinalIgnoreCase))
    {
        parentUrl = parentUrl.Substring(0, parentUrl.Length - 12);

        if (parentUrl.EndsWith("/"))
            parentUrl = parentUrl.Substring(0, parentUrl.Length - 1);
    }

    int i = parentUrl.LastIndexOf("/");

    if (i < 2) return null;

    parentUrl = parentUrl.Substring(0, i + 1);

    return string.Format(CultureInfo.InvariantCulture, "{0}Default.aspx", parentUrl);
}

此代码有效,但对我来说有异味。它不适用于具有查询字符串的网址。如何使用正则表达式改进它?

【问题讨论】:

  • 不管使用正则表达式重新实现您的代码,您都应该首先使用System.Uri 类解析 URL 以仅提取路径字符串,然后对其进行处理。不要尝试解析整个 URL,很容易出错 - 重用现有的工作代码!

标签: c# regex


【解决方案1】:

看看SO question "Getting the parent name of a URI/URL from absolute name C#"的答案

这将向您展示如何使用System.Uri 访问 URL 的各个部分。 System.Uri 还允许以您想要的方式(嗯,不是自定义逻辑)操作 URL,而不会产生创建无效 URL 的危险。无需破解您自己的函数来剖析 URL。

【讨论】:

  • +1 表示不推荐正则表达式!正则表达式不是这项工作的正确工具,标准库是。
  • 非常感谢。我没想到。
【解决方案2】:

直接的方法是用“?”分割网址。并在末尾连接查询字符串...

【讨论】:

    【解决方案3】:

    我建议您不要在这种情况下使用 Regex。解决此任务的正则表达式将是“真正的代码气味”。上面的代码还不错,请使用 f3lix 和 Leon Shmulevich 的建议来改进它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-25
      • 2016-05-15
      • 1970-01-01
      • 1970-01-01
      • 2011-06-06
      • 2013-11-11
      • 2012-08-16
      • 1970-01-01
      相关资源
      最近更新 更多