-1

我正在使用标记语言处理与 URL 匹配的代码(不必有效),您可以简单地导入 URL,也可以在 [ ] 之间添加它。我给你一些例子:
1- http://en.wikipedia.org/wiki/Main_Page
2-[ http://en.wikipedia.org/wiki/Main_Page Title]
3-[ http://en.wikipedia. org/wiki/(Main_Page) Title]
4-( http://en.wikipedia.org/wiki/Main_Page )
5-[http://en.wikipedia.org/wiki/Main_Page]
我需要三个正则表达式,一个用于括号中的 URL (no. 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 许可证中发布您的代码。谢谢

4

1 回答 1

1

描述

这个正则表达式将:

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

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

在此处输入图像描述

例子

现场示例: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] = 

选择

我不确定后视在媒体 wiki 中的效果如何,但你可以试试这个

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

在此处输入图像描述

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

现场示例:http ://www.rubular.com/r/2o9aebq1OZ

许可和免费使用

Stack Overflow 政策说:在cc-wiki下获得许可的用户贡献需要注明出处

于 2013-07-18T20:43:55.200 回答