URL /字符串的正则表达式-如果协议返回false

时间:2019-05-10 04:48:08

标签: javascript regex regex-lookarounds regex-group regex-greedy

试图创建一个正则表达式,其中字符串不应以http(s)://,http(s):// www开头。字符串的其余部分可以是任何东西。

我使用了此regeg,但是如果我们有http://

,则返回true
^(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)); //

使用正则表达式可以吗?

5 个答案:

答案 0 :(得分:2)

您需要在正则表达式中使用负前瞻来丢弃以httphttpsftp之类的协议开头的字符串。您可以使用此正则表达式,

^(?!(?:ftp|https?):\/\/(www\.)?).+$

Regex Demo

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中对其进行测试/修改/更改。

RegEx描述图

此图显示了表达式的工作方式,您可以在此link中可视化其他表达式:

enter image description here

性能测试

此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.  ");