const regex = /^(https?:\/\/)?(www\.)?([^.]+)(\.com|\.co\.uk)(.+|)$/gm;
const str = `example.com
www.example.com
example.co.uk
example.com/page
example.com?key=value
test.example.com
sub.test.example.com`;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}
2条答案
按热度按时间ngynwnxp1#
在这里,我们将从一个右边有
.com
或.co.uk
以及其他字符的表达式开始,如果需要的话,然后我们将向左滑动以收集所有非点字符,添加可选的www
和https
,然后我们将添加一个开始字符^
,这将使所有子域失败:可以将其他TLD添加到此捕获组:
并且表达式可以修改为:
弹性
我想不出有什么方法可以让TLD变得过于灵活,因为这是一个验证表达式。例如,如果我们将其简化为:
它可能适用于问题中列出的URL,但也会通过:
这是无效的。我们只能使用以下表达式:
如果我们知道我们传递的内容,它已经是一个URL。
NOT FUNCTIONAL DEMO(第一个字母)
演示版
下面的代码片段显示了捕获组的工作方式:
RegEx电路
jex.im 将正则表达式可视化:
正则表达式
如果不需要此表达式,可以在regex101.com中修改/更改它。
DEMO(第一个字母)
6ie5vjzr2#
试试这个:
为了更好地处理/PATH示例,我做了一些调整