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

本文关键字:文件夹 路径 URL 提取 字符串 | 更新日期: 2023-09-27 18:34:11

我最近问了一个关于使用正则表达式从字符串中检索URL或文件夹路径的类似问题。我正在看Dour High Arch的这条评论,他说:

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

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

我希望能够解析字符串消息,该消息可能是:

"我把文件放在服务器上 http://www.thewebsite.com/NewStuff,他们也可以 在您的本地网络驱动器上访问 J:''下载''NewStuff">

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

在使用允许此行为的 UriFileInfo 类时,我是否缺少一些东西?如果没有,框架中是否有其他类可以执行此操作?

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

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

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

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

所以像这样:

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

刚刚在 URI 看到。IseWellFormedURI也许可以满足您的需求。如果缺少 http://,则返回 false www.Whatever.com

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

我的建议是定义一个递归下降解析器,并为需要区分的每个子字符串创建状态。

您可以使用

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

每个结果将为您提供 2 组

类型 : "http:"

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

类型 : "J:"

路径 : 'Downloads'NewStuff

从字符串中出来

"我将文件放在服务器上 http://www.thewebsite.com/NewStuff,他们也可以在您的 J:''Downloads''NewStuff的本地网络驱动器">

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


编辑

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

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

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