正则表达式实现
我遇到了这段代码,它应该确定动态(重写)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);
}
此代码的工作,但它的气味给我。它不适用于具有查询字符串的网址。我怎样才能改进它使用正则表达式?
看一看答案SO question "Getting the parent name of a URI/URL from absolute name C#"
这将告诉你如何使用System.Uri
访问的URL的片段。 System.Uri
也允许以你想要的方式操作URL(当然,不是自定义逻辑),而没有创建无效URL的危险。没有必要破解自己的功能来剖析网址。
+1不推荐正则表达式!正则表达式不是这项工作的正确工具,标准库是。 – Will 2009-12-04 18:14:38
非常感谢。我没有想到这一点。 – 2009-12-04 18:43:07
一个直接的方法将分裂URL“?”并连接查询字符串的结尾......
我建议你不要在这种情况下使用正则表达式。解决这个任务的正则表达式将是“真正的代码味道”。上面的代码并不是很糟糕,请使用f3lix和Leon Shmulevich的建议使其更好。
无论用regex重新实现你的代码,你应该首先使用'System.Uri'解析URL来提取路径字符串,然后处理它。不要尝试解析整个URL,这很容易让错误 - 重用现有的工作代码! – 2009-12-04 18:03:23