我想使用正则表达式从大量文本中提取URL,这些URL具有如下特定模式:
http://***/i/***/***
http://***/t/***/***
表示具有此表单的任何链接:
( http://domaine.com/i/text/text )
或此表格:
( http://domaine.com/t/text/text )
需要提取。
到目前为止,我所做的是创建这个正则表达式:
/https?:\/\/(.+?)\/[t|i]\/(.+?)\/(.+)/
到目前为止它运作良好,但我觉得它在生产中使用过于简化,并且不能用于这种特殊情况。
所以我需要的是另一个好的正则表达式或改进这个正则表达式,以防你认为解决我的问题不方便。
答案 0 :(得分:3)
您的模式并不是很糟糕,您可以根据上下文(特别是文字数量,您在问题中未完整描述的网址结构的变化,其他)来改进它:
第一件事:更改分隔符!,这样可以避免失明
~https?://(.+?)/[t|i]/(.+?)/(.+)~
[t|i]
表示: t
或|
或i
,它并不代表 a { {1}}或t
;它是一个角色类,而不是一个群体:
i
您不需要捕获或分组任何内容,如果是这样,请删除这些组:
~https?://(.+?)/[ti]/(.+?)/(.+)~
带有点的非贪婪量词比带有贪心量词的否定字符类慢。另外一点,非贪婪的量词不会阻止匹配斜线(或者如果该行的第一个url与~https?://.+?/[ti]/.+?/.+~
不匹配则还有其他任何东西,并且还有另一个这就行了<)> :
/[ti]/[^/]+/.+
(如果您担心~https?://[^/]+/[ti]/[^/]+/.+~
与换行符匹配,请将其从字符类中排除:[^/]+
)
优于上一个[^/\n]+
,您应该使用.+
(或更严格的内容,可能是\S+
)
[^\s?/]+
完成:有时从单词边界开始以确保~https?://[^/]+/[ti]/[^/]+/\S+~
不是较大单词的结尾并因为它快速丢弃字符串中的许多不可能位置可能是有用的。但是,当您这样做时,请记住,大文本包含的字边界多于http
子字符串。您还需要知道在&#34; normal&#34;之前使用快速搜索算法。当模式以http
这样的文字子字符串开头时,正则表达式遍历以选择字符串中的可能位置。如果在此文字子字符串之前放置一个单词边界,则不会执行此快速算法。这就是为什么,有时候文本很大,是一个很好的替代方案:
http
可以是:
~\bhttps?://[^/]+/[ti]/[^/]+/\S+~
如果字边界存在,则使用lookbehind向后检查。