试图创建一个正则表达式,其中字符串不应以http(s)://,http(s):// www开头。字符串的其余部分可以是任何东西。
我使用了此regeg,但是如果我们有http://
^(http://www.|https://www.|http://|https://)?[a-z0-9]+([-.]{1}[a-z0-9]+)*.[a-z]{2,5}(:[0-9]{1,5})?(/.*)?$
我尝试过的另一个是
var re = new RegExp("(http|https|ftp)://");
var str = "http://xxxx.com";
var match = re.test(str);
console.log(match);
这个也返回true。
此处演示
let re = /(http|https|ftp):///;
let url = 'xxxx.xxxx.xxxx'; // this is valid but test returns false
let url2 = 'https://www.xxzx.com/xxx.aspx'; // this should fail as there is https://www in url
console.log(re.test(url)); //
console.log(re.test(url2)); //
使用正则表达式可以吗?
答案 0 :(得分:2)
您需要在正则表达式中使用负前瞻来丢弃以http
或https
或ftp
之类的协议开头的字符串。您可以使用此正则表达式,
^(?!(?:ftp|https?):\/\/(www\.)?).+$
JS演示
const arr = ['xxxx.xxxx.xxxx','ftp://www.xxzx.com/xxx.aspx','https://www.xxzx.com/xxx.aspx','http://xxxx.com','https://xxzx.com/xxx.aspx','http://www.xxxx.com']
arr.forEach(s => console.log(s + " --> " + /^(?!(?:ftp|https?):\/\/(www\.)?).+$/.test(s)))
答案 1 :(得分:2)
也许可以使用正则表达式,但是除非必须使用正则表达式,否则应使用URL class:
let HTTP_URL = 'https://www.xxzx.com/xxx.aspx'
let HTTPS_URL = 'https://www.xxzx.com/xxx.aspx'
let FTP_URL = 'ftp://www.xxzx.com/xxx.aspx'
let GOOD_PROTOCOL = 'mysql://www.xxzx.com/xxx.aspx'
let GOOD_INPUT = '129.123.12.123'
function test_url(url) {
let bad_protocols = ['http:', 'https:', 'ftp:']
try {
var parsed = new URL(url)
} catch {
return true
}
return (!bad_protocols.contains(parsed.protocol))
}
test_url(HTTP_URL) //false
test_url(HTTPS_URL) //false
test_url(FTP_URL) //false
test_url(GOOD_PROTOCOL) //true
test_url(GOOD_INPUT) //true
答案 2 :(得分:0)
如果您只是想否定该正则表达式:
function doesMatch(string) {
return !/^http(s):\/\/(?:www)?/.test(string);
}
[
'https://www.xxzx.com/xxx.aspx',
'http://www.xxxx.com',
'https://xxxx.com',
'http://xxxx.com',
'https://aaaa.com',
'aaaa.com'
].forEach(s => console.log(doesMatch(s)));
答案 3 :(得分:0)
In your example code,
re.test(url)返回false,因为该字符串中不存在http或https。
在url2中(即“ https://www.xxzx.com/xxx.aspx
”)中,存在https,因此返回true。
答案 4 :(得分:0)
此表达式也可能起作用,它将允许您输入所需的内容,并使所有其他URL失败,并且您也可以简单地将其添加到其字符列表中,否则可能不需要启动其他内容:
^([^http|s|ftp|www|\/\/|])*
xxxx.xxxx.xxxx
ftp://www.xxzx.com/xxx.aspx
https://www.xxzx.com/xxx.aspx
http://xxxx.com
https://xxzx.com/xxx.aspx
http://www.xxxx.com
//www.xxxx.com
您可以在this link中对其进行测试/修改/更改。
此图显示了表达式的工作方式,您可以在此link中可视化其他表达式:
此JavaScript代码段使用简单的100万次for
循环来显示该表达式的性能。
const repeat = 1000000;
const start = Date.now();
for (var i = repeat; i >= 0; i--) {
const string = 'xxxx.xxxx.xxxx';
const regex = /(^([^http|s|ftp|www|\/\/|])*)/gm;
var match = string.replace(regex, "$1");
}
const end = Date.now() - start;
console.log("YAAAY! \"" + match + "\" is a match ");
console.log(end / 1000 + " is the runtime of " + repeat + " times benchmark test. ");