解析字符串以提取URL或文件夹路径

时间:2013-10-07 16:35:13

标签: c# regex parsing

我最近询问similar question使用正则表达式从字符串中检索URL或文件夹路径。我是looking at this comment by Dour High Arch,他说:

  

“我建议你根本不使用正则表达式;使用单独的代码路径   对于URL,使用Uri类和文件路径,使用FileInfo   类。这些类已经处理了解析,匹配和提取   组件,等等。“

我从来没有尝试过这个,但现在我正在研究它,无法弄清楚他所说的实际上对我想要完成的事情是否有用。

我希望能够解析一个类似于:

的字符串消息
  

“我将文件放在http://www.thewebsite.com/NewStuff的服务器上,他们也可以   在J:\ Downloads \ NewStuff“

的本地网络驱动器上访问

并提取出两个字符串http://www.thewebsite.com/J:\Downloads\NewStuff。我没有看到UriFileInfo类中的任何方法从字符串中解析UriFileInfo对象,就像我认为Dour High Arch所暗示的那样。

我是否缺少使用允许此行为的UriFileInfo类的内容?如果没有,框架中还有其他类可以做到这一点吗?

4 个答案:

答案 0 :(得分:1)

我想说最简单的方法是首先将字符串分成几部分。

第一个分隔符是空格,每个单词 - 第二个是qoutes(双和单)

然后在每个令牌上使用Uri.IsWellFormedUriString。

类似于:

foreach(var part in String.Split(new char[]{''', '"', ' '}, someRandomText))
{
    if(Uri.IsWellFormedUriString(part, UriKind.RelativeOrAbsolute))
        doSomethingWith(part);

}

只是在URI.IseWellFormedURIString看到这可能是为了满足您的需求。 如果www.Whatever.com缺少http://

,则返回false

答案 1 :(得分:1)

你可以使用:

(?<type>[^ ]+?:)(?<path>//[^ ]*|\\.+\\[^ ]*)

每个结果将为您提供2组

输入:"http:"

路径://www.thewebsite.com/NewStuff

输入:"J:"

路径:\Downloads\NewStuff

字符串

  

“我把文件放在服务器上   http://www.thewebsite.com/NewStuff,你也可以联系到他们   本地网络驱动器在J:\ Downloads \ NewStuff“

您可以使用“类型”组查看类型是否为http:,并对其设置操作。


编辑

如果您确定文件路径中没有空格,请使用下面的正则表达式:

(?<type>[^ ]+?:)(?<path>//[^ ]*|\\[^ ]*)

答案 2 :(得分:1)

从您之前的问题中不清楚您想从较大的字符串中提取URL和文件路径子字符串。在这种情况下,Uri.IsWellFormedUriStringrRegex.Match都不会做你想要的。实际上,我认为任何简单的方法都不能做你想要的,因为你必须为不明确的字符串定义规则,比如httX:// wasThatAUriScheme / andAre / / part / of / aURL或/他们/ separate.strings?andIsThis% 20A%20Param?

我的建议是定义一个recursive descent parser并为你需要区分的每个子字符串创建状态。

答案 3 :(得分:-1)

尝试\w+:\S+,看看它是否符合您的目的。