正则表达式可捕获网址前缀,但不包括www

时间:2018-12-14 21:43:11

标签: javascript regex lookaround

我一直在试图用javascript(不是专家)来解决正则表达式的使用问题,但是我一直无法解决这个问题。

这是我的网址的一种模式:

https://www.prefix.site.com

以及我当前的正则表达式:

/(?:(\w+)\.)?site\.com

我需要做的是捕获“ .site”之前的前缀,但是鉴于两个“ www。”,我都不想包含“ https://www。”。我的前缀可能存在也可能不存在。我的前缀的示例可以是环境,例如https://testing.site.com

上面的正则表达式的问题是,如果存在“ www”。没有我的前缀,则它将捕获“ www”。作为前缀,那不是我所需要的。

我用一种否定的后向性解决了它,但是由于它在javascript中不可用,所以我不能使用它。

任何提示将不胜感激!

3 个答案:

答案 0 :(得分:2)

在捕获组的最开始,您可以对www.进行负向查找,以确保捕获组仅在包含www.以外的内容时才匹配:

((?!www\.)\b\w+\.)?site\.com

https://regex101.com/r/K8btgd/1

请注意单词边界\b-确保捕获组不是在非单词字符(例如/.)之后开始,还是不会完全匹配(以防止像ww.site.com这样在第三个w前面的匹配)

答案 1 :(得分:1)

听起来下面的内容对您有用:

https?://(?:w{3}\.)?(\w+)\.site\.com

答案 2 :(得分:1)

根据您的需要,此表达式仅捕获前缀:(?!w{1,3}\.)[\w-]+(?=\.example)

https://regex101.com/r/X4L9ZZ/2

它支持破折号并在前缀/子域中正确允许“ w”。

示例:

const getPrefix = uri => {
  const matched = uri.match(/(?!w{1,3}\.)[\w-]+(?=\.example)/);
  return matched && matched[0];
}

getPrefix("https://www.prefix.example.com"); // "prefix"
getPrefix("https://prefix.example.com"); // "prefix"
getPrefix("https://www.example.com"); // null
getPrefix("https://example.com"); // null

好消息是JS将很快完全支持“ lookbehinds”。它已经处于第4阶段,只需跨浏览器实施! https://github.com/tc39/proposal-regexp-lookbehind