最近在做遇到如下的算法题:
其实这算不上什么算法题,纯属是对正则表达式的应用,在这里我们用JavaScript语法进行实现。在实现之前还是先回顾一下知识点吧,在知道的基础看看能不能写出来!
-
正则表达式的两个方法
(1)RegExp.prototype.test(str)
用于测试字符串参数中是否存在匹配正则表达式模式的字符串,如果存在则返回
true
,否则返回
false
。
(2)RegExp.prototype.exec(str)
使用正则表达式模式对字符串执行搜索,并将更新全局RegExp对象的属性以反映匹配结果。
-
如果没有匹配的文本则返回
null
,否则返回一个结果数组。
exec方法在全局和非全局调用时,是有差别的。两者都会返回一个数组,只是非全局调用仅返回第一次的匹配结果。
- 第一个元素是与正则表达式相匹配的文本;
- 第二元素是与RegExpObject的第一个子表达式相匹配的文本(如果有的话);
- 第三个元素是与RegExpObject的第一个子表达式相匹配的文本(如果有的话),以此类推
-
…
其中,
index
、
input
为数组的属性 - index:声明匹配文本的第一个字符的位置;
-
input:存放被检索的字符串
string
-
字符串的四个正则方法
(1)String.prototype.search(reg)
-
search()
方法用于检索字符串中指定的子字符串,或者检索与正则表达式相匹配的子字符串; -
方法返回第一个匹配结果
index
,查找不到返回
-1
; -
search()
方法不执行全局匹配,它将忽略标注
g
,并且总是从字符串的开始进行检索
(2)String.prototype.match(reg) -
match()
方法将检索字符串,以找到一个或多个与
regexp
匹配的文本; -
regexp
是否具有标志
g
对结果影响很大
非全局调用
-
如果
regexp
没有标志
g
,那么
match()
方法就只能在字符串中执行一次匹配; -
如果没有找到任何匹配的文本,将返回
null
; - 否则它将返回一个数组,其中存放了与它找到的匹配文本有关的信息。
- 返回数组的第一个元素存放的是匹配文本,而其余的元素存放的是与正则表达式的子表达式匹配的文本
-
除了常规的数组元素之外,返回的数组还含有2个对象属性
-
index
声明匹配文本的起始字符在字符串的位置; -
input
声明的
stringObject
的引用
全局调用
(3)String.prototype.split(reg)
(4)String.prototype.replace
上面只基本的用法,那么针对这道题,你该选用什么方法呢。第一次做题时,很遗憾并没有做出来,回顾了一下基础知识,还是有思路的。
针对题目中的三点,其实就是两点:
不只是三个同样的字母去掉一个,这个条件可以扩展到三个以上同样的字母,可以通过正则表达式分组的形式:
可能你对正则表达式中的\1和\2,分别表示
-
\1 表示的是正则里,第一个小括号捕获到的内容。
\2 表示的是正则里,第一个小括号捕获到的内容。
思路有了,把它整合成一道算法题,自然不是难事。不足之处,请指正。
扩展资料:
正则表达式匹配重复的字符串[超详细]附完整实例
版权声明:本文为a2013126370原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。