我想匹配一个字符串,规则如下:
1.由字母、数字、点、减号、下划线组成;
2.点(.)、减号(-)、下划线(_)不在开头或结尾;
3.点(.)、减号(-)、下划线(_)任意两个字符不连续出现。
我在匹配第三条规则时候遇到了困难:
我的代码如下
// 匹配
let arr1 = ['a','1','a1','aa','11','1a','a_1','a-1','a.1','a.1.1','a-a-1.1'];
// 不匹配
let arr2 = ['_a','a.-_a','-a','a--a','a-.a','a-','?','aa?','?aa'];
let r = /^[\w^\_][\w\-\.]+[\w^\_]$/;
arr1.forEach(str => {
console.log(r.test(str));
})
arr2.forEach(str => {
console.log(r.test(str));
})
###
上面的好像不能匹配'a_._a'
写个好理解的,任意个(数字或字符)后面跟一个(点、减号或下划线),这组成一个组合,这个组合可以有任意个,最后面是一个(数字或字符)/^([0-9a-zA-Z]+[\.\-_])*[0-9a-zA-Z]+$/
arr1.map(item => /^([0-9a-zA-Z]+[\.\-_])*[0-9a-zA-Z]+$/.test(item))
//[true, true, true, true, true, true, true, true, true, true, true]
arr2.map(item => /^([0-9a-zA-Z]+[\.\-_])*[0-9a-zA-Z]+$/.test(item))
//[false, false, false, false, false, false, false, false, false]
###
const arr1 = ['a','1','a1','aa','11','1a','a_1','a-1','a.1','a.1.1','a-a-1.1'];
const arr2 = ['_a','a.-_a','-a','a--a','a-.a','a-','?','aa?','?aa'];
const reg = /^(?![.\-_])(?!\w*[._-]{2,})[\w._-]*(?<![.\-_])$/
const r1 = arr1.filter(item => reg.test(item));
console.log(r1);
const r2 = arr2.filter(item => reg.test(item));
console.log(r2);
试试呢
兼容低版本浏览的话改成/^(?![.\-_])(?!\w*[._-]{2,})[\w._-]*\w$/
试试
/^[a-zA-Z0-9]+(?:[-._][a-zA-Z0-9]+)*$/
/^[^\W_]+(?:[-._][^\W_]+)*$/
/^[a-z\d]+(?:[-._][a-z\d]+)*$/i
/^(?![-_.])(?!.*[-_.]{2})[-.\w]*[^\W_]+$/