所以我面临的问题更多的是逻辑推理,我无法弄清楚出于某种原因,它是正则表达式和编码相关的。
这是我用来从文档中提取链接的模式;
http(s)?://([\w+?\.\w+])+([a-zA-Z0-9\~\!\^\&\*\(\)_\-\=\+\\\?\/\.\:\;\'\,]*)?
我花了一段时间将它编译在一起,但它工作得很好,从所有文档中提取链接,但我的问题是,如果连接了两个链接,它将它们作为单个匹配提取。
我尝试放置" http"在正则表达式模式结束时,据说可以结束搜索,但这并不起作用。 例如,以下两个链接显示为一个匹配(它们与原始文档中的链接相同);
http://www.preemptive.com/dotfuscator/dtd/dotfuscatorMap_v1.0.dtd/dotfuscatorMap_v1.0.dtdhttp://www.preemptive.com/dotfuscator/dtd/dotfuscatorMap_v1.1.dtd/dotfuscatorMap_v1.1.dtd
正则表达代码,如果你想看看;
Dim regexFunc As New Regex("http(s)?://([\w+?\.\w+])+([a-zA-Z0-9\~\!\^\&\*\(\)_\-\=\+\\\?\/\.\:\;\'\,]*)?", RegexOptions.IgnoreCase)
Dim matches As MatchCollection = regexFunc.Matches(_dataLoaded.ToString)
For Each x As Match In matches
'// A match has been found, can contain one or more links connected.
Next
问题:如果匹配有多个链接,如何拥有它,它将每个链接分开,以便我可以将它们存储在各个链接中...说一个数组? 感谢。
答案 0 :(得分:0)
你可以使用负向前瞻(所谓的tempered greedy token)来调整贪婪量化的角色类:
https?://\w+(?:\.\w+)+(?:(?!https?://)[a-zA-Z0-9~!^&*()_=+\\?/.:;',-])*
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
请参阅regex demo(删除不必要的组和转义符。)
请注意,[\w+?\.\w+]
是一个字符类(由于未转义的方括号),它与1个字符匹配,可以是字符或+
,?
或.
。因此,我建议将其重写为\w+(?:\.\w+)+
(根据您的要求进行调整)。
如果正则表达式存储在某种XML中,&
就可以了,否则只需用&
替换。
<强>详情:
https?://
- http://
或https://
\w+
- 1 + word chars (?:\.\w+)+
- 1个点和1个字符的序列(?:(?!https?://)[a-zA-Z0-9~!^&*()_=+\\?/.:;',-])*
- 一个驯化的贪婪标记,匹配字符类中定义的任何不会启动http://
或https://
字符序列的字符。