通过Regex以标记语言匹配URL

时间:2013-07-18 15:59:27

标签: regex url mediawiki

我正在使用标记语言编写代码匹配URL(无需有效),您只需导入URL或者可以在[]之间添加它。我举几个例子:
1 - http://en.wikipedia.org/wiki/Main_Page
2 - [http://en.wikipedia.org/wiki/Main_Page标题]
3 - [http://en.wikipedia.org/wiki/(Main_Page)标题]
4 - (http://en.wikipedia.org/wiki/Main_Page
5- [http://en.wikipedia.org/wiki/Main_Page]
我需要三个正则表达式,一个用于括号中的URL(编号2,3,5),另一个用于不在括号(1,4)中的URL和一个用于所有这些的URL 第一个和第二个很容易我做到了:

notInside = '\]\s<>"'
notAtEnd = '\]\s\.:;,<>"\|\)'
regex = r'(?P<url>http[s]?://[^%(notInside)s]*?[^%(notAtEnd)s]' \
r'(?=[%(notAtEnd)s]*\'\')|http[s]?://[^%(notInside)s]*' \
r'[^%(notAtEnd)s])' % {'notInside': notInside, 'notAtEnd': notAtEnd}

但是问题从第三个问题开始,一个URL以括号开头(或者除括号之外的任何东西),例如数字4,正则表达式不应该与URL末尾的“)”相匹配,但有时人们使用“)”在URL的末尾并放入括号中,正则表达式必须匹配这个“)”,就像数字3.我不能为第三个写单独的正则表达式并结合结果

另一件事:我会在免费软件代码中发布您的帮助,所以请说明我没有在MIT许可证中发布您的代码。谢谢

1 个答案:

答案 0 :(得分:1)

描述

这个正则表达式将:

  • 匹配在方括号,圆括号和无括号
  • 中找到的字符串网址
  • 每种类型的括号内匹配将在不同的捕获组中捕获

\[(https?:\/\/(?:(?!\]).)*)\]|\((https?:\/\/(?:(?!\)).)*)\)|(https?:\/\/(?:(?!\s|$|\Z).)*)

enter image description here

实施例

直播示例:http://www.rubular.com/r/g7o1xdOGB5

示例文字

1-http://1en.wikipedia.org/wiki/Main_Page
2-[http://2en.wikipedia.org/wiki/Main_Page Title]
3-[http://3en.wikipedia.org/wiki/(Main_Page) Title]
4-(http://4en.wikipedia.org/wiki/Main_Page)
5-[http://5en.wikipedia.org/wiki/Main_Page]

<强>匹配

[0][0] = http://1en.wikipedia.org/wiki/Main_Page
[0][1] = 
[0][2] = 
[0][3] = http://1en.wikipedia.org/wiki/Main_Page

[1][0] = [http://2en.wikipedia.org/wiki/Main_Page Title]
[1][1] = http://2en.wikipedia.org/wiki/Main_Page Title
[1][2] = 
[1][3] = 

[2][0] = [http://3en.wikipedia.org/wiki/(Main_Page) Title]
[2][1] = http://3en.wikipedia.org/wiki/(Main_Page) Title
[2][2] = 
[2][3] = 

[3][0] = (http://4en.wikipedia.org/wiki/Main_Page)
[3][1] = 
[3][2] = http://4en.wikipedia.org/wiki/Main_Page
[3][3] = 

[4][0] = [http://5en.wikipedia.org/wiki/Main_Page]
[4][1] = http://5en.wikipedia.org/wiki/Main_Page
[4][2] = 
[4][3] = 

替代

我不确定外观在媒体维基中有多好,但你可以试试这个

(?<=\[)https?:\/\/(?:(?!\]).)*(?=\])|(?<=\()https?:\/\/(?:(?!\)).)*(?=\))|https?:\/\/(?:(?!\s|$|\Z).)*

enter image description here

给定相同的示例文本,这将把所有捕获放入组0

直播示例:http://www.rubular.com/r/2o9aebq1OZ

许可和免费使用

Stack Overflow政策说明:在cc-wiki下使用attribution required

许可的用户贡献