首页 > 财经 >

正则小应用:循环链表型数据(2)

2018-09-19 07:07:21 网络整理 阅读:62 评论:0

首先我知道最傻的办法是:functioncheck(array){if(array.length<total)returnfalseletstring=array.join('')returnstring==='12341234'||string==='23412341'||string==='34123412'||string==='41234123'}

当然,觉得太low了,改用正则:functioncheck(array){if(array.length<total)returnfalsereturn/12341234|23412341|34123412|41234123/.test(array.join(''))}

可以优化一下:functioncheck(array){if(array.length<total)returnfalsereturn/(1234|2341|3412|4123)\1/.test(array.join(''))}

其中正则使用了反向引用\1,表示前面括号里匹配到的内容。注意此正则不可以写成:/(1234|2341|3412|4123){2}/

其实,它并不等价于:/(1234){2}|(2341){2}|(3412){2}|(4123){2}/

因为前者还匹配如下的字符串:/(1234|2341|3412|4123){2}/.test('12342341')// true

到这里,我又想到,如果需求是顺时针走三圈的话,就可以改成:/(1234|2341|3412|4123)\1{2}/

突然脑海里进来一个恶魔,如果是两圈半呢?比如 '1234123412' 这样的数据。最开始想到的是正则:/((12)34|(23)41|(34)12|(41)23)\1\2/

后来发现匹配其他数据,比如 '2341234123' 这个,就不可以。因为其中 \2 始终指向第二个括号里匹配的数据,即(12)。因此要匹配它,正则应该是:/((12)34|(23)41|(34)12|(41)23)\1\3/.test('2341234123')// true

如果要把四种情况考虑进来的话,那还不如下面的这种方式来得直接呢:/1234123412|2341234123|3412341234|4123412341/

至此我对于自己的思考还挺满意。正洋洋得意时,脑海里又进来一个恶魔,假如平板不是四个角呢?!

虽然现实的平板或者web页面都是方形的。

相关文章