我一直在试图用javascript(不是专家)来解决正则表达式的使用问题,但是我一直无法解决这个问题。
这是我的网址的一种模式:
https://www.prefix.site.com
以及我当前的正则表达式:
/(?:(\w+)\.)?site\.com
我需要做的是捕获“ .site”之前的前缀,但是鉴于两个“ www。”,我都不想包含“ https://www。”。我的前缀可能存在也可能不存在。我的前缀的示例可以是环境,例如https://testing.site.com
上面的正则表达式的问题是,如果存在“ www”。没有我的前缀,则它将捕获“ www”。作为前缀,那不是我所需要的。
我用一种否定的后向性解决了它,但是由于它在javascript中不可用,所以我不能使用它。
任何提示将不胜感激!
答案 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