我有一个包含字段“URL”的表单。第一部分需要由用户在文本框中填充。第二部分是预定义的,显示在文本框的右侧。
例如,用户在文本框中输入“test”。第二部分预定义为“.example.com”。因此,总网址变为“test.example.com”。
我需要一个正则表达式来验证第一部分。要满足以下条件:
不应以连字符开头或结尾
至少应包含一个字母
长度应在4到21之间
我使用了此主题中提到的正则表达式/^(?!:\/\/)([a-zA-Z0-9]+\.)?[a-zA-Z0-9][a-zA-Z0-9-]+\.[a-zA-Z]{2,6}?$/I
:
Javascript regex to match fully qualified domain name, without protocol, optional subdomain
但是这个正则表达式验证了整个URL(包括第二部分)。我只需要第一部分的验证。
如何修改当前正则表达式以符合要求?
答案 0 :(得分:0)
分解。使用正则表达式:
[Range(1,10)]
(必须不匹配)/^-|-$/
(必须匹配)/[a-z]/i
(必须匹配)这样做的好处是您可以向用户提供有意义的错误消息。
/^[a-z0-9-]{4,21}$/i
document.getElementById('subdomain').addEventListener("input",function() {
var input = this.value;
if( input.match(/^-|-$/)) this.setCustomValidity("Cannot start or end with a hyphen");
else if( !input.match(/[a-z]/i)) this.setCustomValidity("Must contain at least one letter");
else if( !input.match(/^[a-z0-9-]{4,21}$/)) this.setCustomValidity("Must be between 4 and 21 characters long");
// add additional checks here, eg. /^[0-9]/ => Cannot start with a number
else this.setCustomValidity("");
},true);
答案 1 :(得分:0)
这应该可以解决问题:
/^(?=.*[A-Za-z])([0-9A-Za-z][0-9A-Za-z-]{2,19}[0-9A-Za-z])$/
说明:
(?=.*[A-z])
积极向前看(至少有一个来自[A-z]
的字符集)([0-9A-z]
打开没有连字符的模式[0-9A-z])
关闭没有连字符的模式[0-9A-z-]{2,19}
- 应该在第一个和最后一个字符之间的其余部分(使用连字符,从4 - 2
到21 - 2
)检查:
var RE = /^(?=.*[A-z])([0-9A-z][0-9A-z-]{2,19}[0-9A-z])$/;
console.log(RE.test('-hyphen'), false);
console.log(RE.test('hyphen-'), false);
console.log(RE.test('lt4'), false);
console.log(RE.test('morethan21-morethan21-morethan21-morethan21-morethan21'), false);
console.log(RE.test('23123'), false);
console.log(RE.test('231-23'), false);
console.log(RE.test('[\]^_`'), false);
console.log(RE.test('H231-23'), true);
console.log(RE.test('2s31-23'), true);

this answer对积极展望东西(?=.*[A-z])
答案 2 :(得分:0)
我看到了很多问题和答案,我无法给出一个很好的答案。
我看到有些人没有遵循域名注册的规则,例如(域名中不能连续多次使用“-”,但可以多次使用。例如:www.my--domain-name.com为假,并且www.my-domain-name.com是正确的。
例如,我看到了此链接What is a good regular expression to match a URL?,但存在一些问题。
我使用了这段代码(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s]{2,}|www\.[a-zA-Z0-9]+\.[^\s]{2,})
,但无法解决问题
我在asp.net中使用了此正则表达式,它对我的工作是如此好:
^[(((ftp|http|https):\/\/)?(?:www\.|(?!www))[\u0061-\u007a\u0041-\u005a\u0030-\u0039 \u2000-\u200f\u2028-\u202f\u0621-\u0628\u062a-\u063a\u0641-\u0642\u0644-\u0648\u064e-\u0651\u0655\u067e\u0686\u0698\u06a9\u06af\u06be\u06cc\u06f0-\u06f9\u0629\u0643\u0649-\u064b\u064d\u06d5\u0660-\u0669\u005c]+(-[\u0061-\u007a\u0041-\u005a\u0030-\u0039 \u2000-\u200f\u2028-\u202f\u0621-\u0628\u062a-\u063a\u0641-\u0642\u0644-\u0648\u064e-\u0651\u0655\u067e\u0686\u0698\u06a9\u06af\u06be\u06cc\u06f0-\u06f9\u0629\u0643\u0649-\u064b\u064d\u06d5\u0660-\u0669\u005c]+)*\.[^\s^_]{2,}|www\.[\u0061-\u007a\u0041-\u005a\u0030-\u0039 \u2000-\u200f\u2028-\u202f\u0621-\u0628\u062a-\u063a\u0641-\u0642\u0644-\u0648\u064e-\u0651\u0655\u067e\u0686\u0698\u06a9\u06af\u06be\u06cc\u06f0-\u06f9\u0629\u0643\u0649-\u064b\u064d\u06d5\u0660-\u0669\u005c]+(-[\u0061-\u007a\u0041-\u005a\u0030-\u0039 \u2000-\u200f\u2028-\u202f\u0621-\u0628\u062a-\u063a\u0641-\u0642\u0644-\u0648\u064e-\u0651\u0655\u067e\u0686\u0698\u06a9\u06af\u06be\u06cc\u06f0-\u06f9\u0629\u0643\u0649-\u064b\u064d\u06d5\u0660-\u0669\u005c]+)*\.[^\s^_]{2,}|((ftp|http|https):\/\/)?(?:www\.|(?!www))[\u0061-\u007a\u0041-\u005a\u0030-\u0039 \u2000-\u200f\u2028-\u202f\u0621-\u0628\u062a-\u063a\u0641-\u0642\u0644-\u0648\u064e-\u0651\u0655\u067e\u0686\u0698\u06a9\u06af\u06be\u06cc\u06f0-\u06f9\u0629\u0643\u0649-\u064b\u064d\u06d5\u0660-\u0669\u005c]+(-[\u0061-\u007a\u0041-\u005a\u0030-\u0039 \u2000-\u200f\u2028-\u202f\u0621-\u0628\u062a-\u063a\u0641-\u0642\u0644-\u0648\u064e-\u0651\u0655\u067e\u0686\u0698\u06a9\u06af\u06be\u06cc\u06f0-\u06f9\u0629\u0643\u0649-\u064b\u064d\u06d5\u0660-\u0669\u005c]+)*\.[^\s^_]{2,}|www\.[\u0061-\u007a\u0041-\u005a\u0030-\u0039 \u2000-\u200f\u2028-\u202f\u0621-\u0628\u062a-\u063a\u0641-\u0642\u0644-\u0648\u064e-\u0651\u0655\u067e\u0686\u0698\u06a9\u06af\u06be\u06cc\u06f0-\u06f9\u0629\u0643\u0649-\u064b\u064d\u06d5\u0660-\u0669\u005c]+(-[\u0061-\u007a\u0041-\u005a\u0030-\u0039 \u2000-\u200f\u2028-\u202f\u0621-\u0628\u062a-\u063a\u0641-\u0642\u0644-\u0648\u064e-\u0651\u0655\u067e\u0686\u0698\u06a9\u06af\u06be\u06cc\u06f0-\u06f9\u0629\u0643\u0649-\u064b\u064d\u06d5\u0660-\u0669\u005c]+)*\.[^\s^_]{2,}]{1,2083}$
当然,我的正则表达式专门针对波斯语言,如果您想将其用于英语,则必须使用以下语言:
^[(((ftp|http|https):\/\/)?(?:www\.|(?!www))[\u0061\u002d\u007a\u0041\u002d\u005a\u0030\u002d\u0039]+(-[\u0061\u002d\u007a\u0041\u002d\u005a\u0030\u002d\u0039]+)*\.[^\s^_]{2,}|www\.[\u0061\u002d\u007a\u0041\u002d\u005a\u0030\u002d\u0039]+(-[\u0061\u002d\u007a\u0041\u002d\u005a\u0030\u002d\u0039]+)*\.[^\s^_]{2,}|((ftp|http|https):\/\/)?(?:www\.|(?!www))[\u0061\u002d\u007a\u0041\u002d\u005a\u0030\u002d\u0039]+(-[\u0061\u002d\u007a\u0041\u002d\u005a\u0030\u002d\u0039]+)*\.[^\s^_]{2,}|www\.[\u0061\u002d\u007a\u0041\u002d\u005a\u0030\u002d\u0039]+(-[\u0061\u002d\u007a\u0041\u002d\u005a\u0030\u002d\u0039]+)*\.[^\s^_]{2,}]{1,2083}$