分析字符串以提取 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
.我在 Uri
或 FileInfo
类上没有看到任何方法可以从字符串中解析Uri
或FileInfo
对象,就像我认为 Dour High Arch 所暗示的那样。
在使用允许此行为的 Uri
或 FileInfo
类时,我是否缺少一些东西?如果没有,框架中是否有其他类可以执行此操作?
我想说最简单的方法是先将字符串分成几部分。
第一个分隔符是空格,对于每个单词 - 第二个分隔符是 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.IsWellFormedUriString
和rRegex.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+
,看看这是否符合您的目的。