使用JavaScript的正则表达式来完成字符串去重

437 阅读3分钟

使用JavaScript的正则表达式完成字符串去重

常规的字符串去重的方式大概有以下几种方式:

    • 最快捷的方式就是使用es2015新增加的Set数据结构,由于Set()构造函数接收的是是一个可迭代的数据类型,所有的于字符串是可迭代类型可以直接传入传入字符串进行去重

code.png 运行效果:

截屏2022-05-05 下午1.24.45.png

2.使用过数组的方式来进行字符串进行去重,使用数组来进行去重的方式有非常的多,可以对数组进行迭代之后,然后可以使用indexOf()或者es2015新增加的find()和findIndex()来判断,该元素是否是重复的元素,比如下面为使用find()来进行判断,find()接收一个函数如果找到了指定的元素的话就会返回指定的元素,如果没有找到的话就会返回undefined。

code.png

  1. 可以使用for/of对字符串进行遍历之后,然后在使用es2015中的includes()方法来对字符串进行去重。

code.png

4.让字符串作为对象的属性的键名来去重,因为对象的属性键名是不能够进行重复的,所以可以是用对象属性的键名,还可以是es2015中的Map映射这种数据结构来进行去重,下面这段代码是使用Map数据结构来进行实现的。

code.png

5.前面介绍了一些常规的去重操作,但其实还有很多种方法,下面我就使用一种正则表达式来完成字符串的去重。先回顾一下一些正则表达式的一些简单的概念,

  • 常见的一些字符类
    1. \w=[0-9a-zA-Z]
    2. \W=[^0-9a-zA-Z]
    3. \d=[0-9]
    4. \D=[^0-9]
    5. \s代表的是一些空格字符
    6. \S代表的是非空格字符
    7. \b代表退格符
  • 重复规则
    1. {2}代表重复的次数为2次,而不是{,2}这样写会执行失败
    2. {n,m}代表的是重n到m次
    3. *代表{0,}
    4. +代表{1,}
    5. ?代表{0,1}
  • 分组使用()在特定的标志位下可以进行可以进行重复或者进行分组
  • 锚点定界符
    1. \b匹配的的是单词字符定界符
    2. \B匹配单词的是非单词字符的定界符
    3. ?=正向确定查找,?<=正向否定查找
    4. ?<=反向确定查找,?<!反向否定查找
  • 好了差不多上面这些知识就可以实现字符串进行去重了,先看一下下面的实现代码。

code.png 下面对这些代码做一下解释:

  1. 首先就是使用((\b|\B)(?=(\w\s))我的目的就是想要匹配当前,我正要匹配的字符但是我必须要把我当前匹配字符进行保存下来,因为在后面我想要使用这个字符,而使用这种语法的好处就是,我会记住捕获组里面的内容,但是我不会进行实际匹配,实际匹配操作是交给我后面的字符串来完成
  2. \2代表前面捕获组中捕获到的字符串,这个\2是代表的一个实际捕获到的字符,而并不是替换成一个\w的字符类,
  3. (?<!\2[\w\s])\2代代表的意思是我首先定位我要匹配的字符\2,然后通过(?<!\2[\w\s])这个反向查找操作,判断\2字符前面是否存在一个和\2一样的字符,如果说不存在的话那么就说明这个字符串的是我第一次匹配到的,如果后面匹配的时候碰到了一个和自己同样的字符这就说明了,字符发生重复跳过,进行下一个匹配。
  4. 将上g标志位之后,就可以进行全局匹配返回一个匹配到的字符数组,然后使用.join("")拼接成字符串就可以了。