javascript 改进正则表达式性能,以便仅在匹配中间时匹配前缀/后缀

quhf5bfb  于 2023-01-16  发布在  Java
关注(0)|答案(2)|浏览(116)

我有一个正则表达式,它的意思是识别域名是否在正文中:
/.domain\.com\/path/
如果找到了,我还想捕获它的完整URL,它可能存在也可能不存在。所以我在开始/结束处添加了以下内容:
/[^\s'"]*\.domain\.com\/path[^\s'"]*\/来捕捉像https://subdomain.domain.com/path/path/?asdf#char这样的东西
是否有更高性能的方法来执行此操作,以使整个文档不会扫描[^\s'"],除非存在.domain.com/path
由于开头和结尾的[^\s'"]字符类,速度很慢。如何提高性能?
我选择了\s'",因为空格和单/双引号表示URL字符串已经开始/结束。

u0njafvf

u0njafvf1#

提高此正则表达式性能的一种方法是使用"惰性"限定符 *?而不是 *。这将使正则表达式在. www.example.com匹配项之后查找空格、单引号或双引号的第一个示例,而不是在匹配项之后搜索这些字符的所有示例。domain.com/path match, instead of searching for all instances of those characters after the match.
因此,代替:

/[^\s'"]*\.domain\.com\/path[^\s'"]*\/

您可以使用:

/[^\s'"]*?\.domain\.com\/path[^\s'"]*?\/
  • ?限定符将匹配尽可能少的字符,这将使正则表达式在找到结尾空格、单引号或双引号时立即停止搜索。这可以大大提高性能,特别是在搜索的文本中有许多这些字符的示例时。

另一种提高性能的方法是使用正向的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.
这样,您可以确保正则表达式仅在其前面或后面有特定模式时才匹配目标模式,这将提高性能并使搜索更具体。

wj8zmpe1

wj8zmpe12#

假设您希望每个URL都以httphttps开始,您可以用途:

/https?:\/\/[^\s'"]*\.domain\.com\/path[^\s'"]*\/

这个正则表达式只会检查真正URL的任何子字符串的域。

相关问题