正则表达式捕获特殊代码的链接

时间:2016-06-22 17:32:46

标签: c# regex

我有一个接近但不完全正则的正则表达式:

(https?)://([\w+?\.\w+])+([a-zA-Z0-9\~\!\@\#\$\%\^\&\*\(\)_\-\=\+\\\/\?\.\:\;\'\,\<\>]*)

它应该在被替换之前捕获其中包含特殊代码的链接。这是一个示例文本:

some leading text <a>http://subsite.domain.com/somepage.aspx?querystring1=<#specialcode#></a>. Some text afterwards

另一个例子:

some leading text <a>http://subsite.domain.com/somepage.aspx?querystring1=<#first#>&querystring2=<#another#>&querystring3=foo&querystring4=<#bar#></a>

甚至只是&#34;普通&#34;链接:

some leading text <a>http://subsite.domain.com/somepage.aspx?querystring1=foo&querystring2=bar</a>

我想捕获所有这些链接,没有标记,有些链接包含分隔符。

根据测试人员的说法,它已经关闭,但它会在结束时和期间继续关闭标签。我知道为什么,我只是不知道如何解决它。在我的例子中,我需要捕获&lt;#specialcode#&gt;以及之后的任意数量的其他查询字符串。没有太多细节,&lt;#和#&gt;是应用程序中的分隔符。这里的任何帮助将不胜感激。

我从这里获取了根正则表达式:Get url from a text 我在这里尝试过测试:http://www.regextester.com/

2 个答案:

答案 0 :(得分:1)

假设输入文本不是正确的HTML文档,并且假设您只是想提取网址和查询字符串和参数,那么这个正则表达式将会这样做:

(https?:\/\/[^?<]+)[?]?(([^=<]+)=(<#[^&<]*#>|[^&<]*)&?)*

这基于以下测试输入:

some leading text <a>http://subsite.domain.com/somepage.aspx?querystring1=<#specialcode#></a>. Some text afterwards
some leading text <a>http://subsite.domain.com/somepage.aspx?querystring1=<#specialcode#>&querystring2=foo</a>. Some text afterwards
some leading text <a>http://subsite.domain.com/somepage.aspx?querystring1=<#specialcode#>&querystring2=foo&querystring3=<#specialcode2#></a>. Some text afterwards
some leading text <a>http://subsite.domain.com/somepage.aspx</a>. Some text afterwards

结果将在捕获组中。

如果给定的文本是HTML文档,那么正则表达式必须更改,因为它不在<a>http://linkhere.com</a>内的链接中,而是在href属性中:<a href="http://linkhere.com">link here</a>

答案 1 :(得分:0)

在比赛之间没有特定棋子的情况下获得比赛,未知出现? 只用一个正则表达式就很难做到。

分开工作可能更容易。

找到链接的正则表达式(包含奇怪的&lt; ##&gt;标记)。

(https?):(\/+.*)(?=<\/a>)

第二个正则表达式找到&amp;删除那些奇怪的&lt; ##&gt;标记:

[&]?\w+=<#[^#]*#>