问答

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

作者:admin 2021-07-01 我要评论

我想匹配一个字符串,规则如下: 1.由字母、数字、点、减号、下划线组成; 2.点(.)、减号(-)、下划线(_)不在开头或结尾; 3.点(.)、减号(-)、下划线(_)任意两个...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

我想匹配一个字符串,规则如下:
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_]+$/

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 如何正则匹配:连续的字符不重复?

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

  • 为什么React 点击一次按钮,render执行

    为什么React 点击一次按钮,render执行

  • vue中嵌入3d模型。请问怎么点击下拉框

    vue中嵌入3d模型。请问怎么点击下拉框

  • egg框架使用 egg-sequelize创建的model

    egg框架使用 egg-sequelize创建的model

腾讯云代理商
海外云服务器