1

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

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

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

我希望能够解析可能类似于以下内容的字符串消息:

“我将文件放在服务器上http://www.thewebsite.com/NewStuff,也可以在 J:\Downloads\NewStuff 的本地网络驱动器上访问它们”

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

关于使用允许这种行为的Urior类,我有什么遗漏吗?FileInfo如果没有,框架中是否还有其他类可以做到这一点?

4

4 回答 4

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

于 2013-10-07T16:44:09.620 回答
1

你可以使用:

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

这将为您提供每个结果的 2 个组

类型 :"http:"

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

类型 :"J:"

小路 :\Downloads\NewStuff

在字符串之外

“我将文件放在服务器上 http://www.thewebsite.com/NewStuff,也可以在 J:\Downloads\NewStuff 的本地网络驱动器上访问它们”

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


编辑

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

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

于 2013-10-07T17:25:06.980 回答
1

从您之前的问题中不清楚您想从较大的字符串中提取 URL 和文件路径子字符串。在这种情况下,既不Uri.IsWellFormedUriStringrRegex.Match不会做你想做的事。事实上,我认为任何简单的方法都无法满足您的需求,因为您必须为诸如 httX://wasThatAUriScheme/andAre/these part/of/aURL 或/are they/separate.strings?andIsThis% 之类的模棱两可的字符串定义规则20a%20 参数?

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

于 2013-10-07T17:31:01.547 回答
-1

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

于 2013-10-08T17:19:59.227 回答