我最近询问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
。我没有看到Uri
或FileInfo
类中的任何方法从字符串中解析Uri
或FileInfo
对象,就像我认为Dour High Arch所暗示的那样。
我是否缺少使用允许此行为的Uri
或FileInfo
类的内容?如果没有,框架中还有其他类可以做到这一点吗?
答案 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.IsWellFormedUriString
和rRegex.Match
都不会做你想要的。实际上,我认为任何简单的方法都不能做你想要的,因为你必须为不明确的字符串定义规则,比如httX:// wasThatAUriScheme / andAre / / part / of / aURL或/他们/ separate.strings?andIsThis% 20A%20Param?
我的建议是定义一个recursive descent parser并为你需要区分的每个子字符串创建状态。
答案 3 :(得分:-1)
尝试\w+:\S+
,看看它是否符合您的目的。