如何正则匹配:连续的字符不重复?

我想匹配一个字符串,规则如下:
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));
})
阅读 10.4k
3 个回答

上面的好像不能匹配'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_]+$/
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏