4

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

这是我的网址的模式:

https://www.prefix.site.com

而我目前的正则表达式:

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

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

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

我有点用消极的后视解决了它,但由于它在 javascript 中不可用,我不能使用它。

任何提示将不胜感激!

4

3 回答 3

2

在捕获组的最开始,您可以否定前瞻,www.以确保捕获组仅在包含以下内容时才匹配www.

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

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

请注意单词边界\b- 这是为了确保捕获组在非单词字符(如 a/或 a .)之后开始,或者根本不匹配(以防止匹配,例如在它前面ww.site.com的第三个位置w

于 2018-12-14T21:54:54.553 回答
1

听起来以下内容对您有用:

https?://(?:w{3}\.)?(\w+)\.site\.com
于 2018-12-14T21:51:02.227 回答
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

于 2018-12-14T23:10:04.467 回答