当前位置:  开发笔记 > 编程语言 > 正文

如何匹配文本中的URI?

如何解决《如何匹配文本中的URI?》经验,为你挑选了1个好方法。

如何在一个文本块中发现URI?

我们的想法是将这些文本转换为链接.如果只考虑http(s)和ftp(s)方案,这很简单; 但是,我猜测一般问题(考虑tel,mailto和其他URI方案)要复杂得多(如果可能的话).

如果可能的话,我更喜欢C#中的解决方案.谢谢.



1> jamesh..:

虽然URI和URL很难与单一模式匹配,但正则表达式可能是一个很好的起点.

为了说明,最简单的模式看起来相当复杂(在Perl 5表示法中):

\w+:\/{2}[\d\w-]+(\.[\d\w-]+)*(?:(?:\/[^\s/]*))*

这会匹配 http://example.com/foo/bar-baz

ftp://192.168.0.1/foo/file.txt

但至少会导致问题:

mailto:support@stackoverflow.com(不匹配 - 不//,但现在@)

ftp://192.168.0.1.2 (匹配,但数字太多,所以它不是有效的URI)

ftp://1000.120.0.1 (匹配,但IP地址需要0到255之间的数字,因此它不是有效的URI)

nonexistantscheme://obvious.false.positive

http://www.google.com/search?q=uri+regular+expression (匹配,但查询不是我认为这是80:20规则的情况.如果你想抓住大多数事情,那么如果你不能自己写一个,我会按照建议找到一个体面的正则表达式.

如果您正在查看从相当受控制的来源(例如机器生成)中提取的文本,那么这将是最佳的行动方案.

如果你绝对肯定必须抓住你遇到的每一个URI,并且你正在查看来自野外的文本,那么我想我会寻找带有冒号的任何单词,例如\s(\w:\S+)\s.一旦你有一个合适的URI候选者,然后将它传递给你正在使用的任何库的URI类中的真正的URI解析器.

如果你对为什么编写URI模式这么难感兴趣,我想这就是URI的定义是用Type-2语法完成的,而正则表达式只能解析Type-3语法中的语言.

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有