.NET - 正则表达式模式匹配

时间:2017-01-21 14:12:43

标签: .net regex vb.net

所以我面临的问题更多的是逻辑推理,我无法弄清楚出于某种原因,它是正则表达式和编码相关的。

这是我用来从文档中提取链接的模式;

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

问题:如果匹配有多个链接,如何拥有它,它将每个链接分开,以便我可以将它们存储在各个链接中...说一个数组? 感谢。

1 个答案:

答案 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~!^&amp;*()_=+\\?/.:;',-])* - 一个驯化的贪婪标记,匹配字符类中定义的任何不会启动http://https://字符序列的字符。