我有一个正则表达式,它的意思是识别域名是否在正文中:/.domain\.com\/path/
如果找到了,我还想捕获它的完整URL,它可能存在也可能不存在。所以我在开始/结束处添加了以下内容:/[^\s'"]*\.domain\.com\/path[^\s'"]*\/
来捕捉像https://subdomain.domain.com/path/path/?asdf#char
这样的东西
是否有更高性能的方法来执行此操作,以使整个文档不会扫描[^\s'"]
,除非存在.domain.com/path
?
由于开头和结尾的[^\s'"]
字符类,速度很慢。如何提高性能?
我选择了\s
、'
和"
,因为空格和单/双引号表示URL字符串已经开始/结束。
2条答案
按热度按时间u0njafvf1#
提高此正则表达式性能的一种方法是使用"惰性"限定符 *?而不是 *。这将使正则表达式在. www.example.com匹配项之后查找空格、单引号或双引号的第一个示例,而不是在匹配项之后搜索这些字符的所有示例。domain.com/path match, instead of searching for all instances of those characters after the match.
因此,代替:
您可以使用:
另一种提高性能的方法是使用正向的lookaheads和lookbehinds,这些构造允许您在不消耗任何字符的情况下匹配模式,因此您可以在匹配之前或之后检查某些条件。
例如,您可以在. www.example.com匹配之前使用正前视(?=...)来检查其前面是否有特定模式,或者在. domain.com/path匹配之后使用正后视(?〈=...)来检查其后面是否有特定模式。domain.com/path match to check if it is preceded by a certain pattern, or use positive lookbehind (?<=...) after the .domain.com/path match to check if it is followed by a certain pattern.
这样,您可以确保正则表达式仅在其前面或后面有特定模式时才匹配目标模式,这将提高性能并使搜索更具体。
wj8zmpe12#
假设您希望每个URL都以
http
或https
开始,您可以用途:这个正则表达式只会检查真正URL的任何子字符串的域。