從一道JavaScript題目學點正則

這是一篇普通的教程,同時也是個人一篇筆記。原由是看到一道題目的另一種解法特別有意思,同時也作一點正則的筆記,好理解。html

題目

我印象中的這道題目是:
有一組數組爲[1,1,2,3,3,3,3,4,5,5,5,6,6]
使用js
把它變成[[1,1],2,[3,3,3],4,[5,5,5].[6,6]]正則表達式

解法有不少,我這裏只列出兩種數組

解法一

咱們平時的解法通常爲:
數組嵌套,將含有相同的值得數組放入新數組裏面
而後對新數組進行,對裏面的嵌套數組進行個數判斷並返回值,從新組成一個新數組
新數組就是答案typecho

var arr = [1,1,2,3,3,3,3,4,5,5,5,6,6];
var tempArr = [];
var result = [];
var i,len,item,lastArr;

for(i = 0,len = arr.length;i < len;i++){
    item = arr[i];
    lastArr = tempArr.slice(-1)[0];

    if(!lastArr || lastArr[0] != item){
        lastArr = [];
        tempArr.push(lastArr);
    }

    lastArr.push(item);
}

for(i=0,len=tempArr.length;i<len;i++){
    item = tempArr[i];
    result.push(item.length > 1 ? item : item[0]);
}

console.log(result);

解法二

若是咱們用正則的話,那解法以下:code

var arr = [1,1,2,3,3,3,3,4,5,5,5,6,6];

var result = "[" +
    (arr.toString() + ",")
        .replace(/(([^,]+,)\2+)/g,'[$1],')
        .replace(/,(]|$)/g,'$1')
    + "]";

console.log(JSON.parse(result));

這樣一會兒就變得很高效,正則找出兩個以上的相同值的位置,插入[]
而後打印出來便可。htm

從這段代碼,咱們能夠看出,
先對把數組字符串化對象

var result = "[" +
    (arr.toString() + ",")
    + "]";

變成[1,1,2,3,3,3,3,4,5,5,5,6,6,]教程

而後匹配兩個以互爲相同的值,套上[]字符串

var result = "[" +
    (arr.toString() + ",")
        .replace(/(([^,]+,)\2+)/g,'[$1],')
    + "]";

最後是找到]前面多餘的,get

var result = "[" +
    (arr.toString() + ",")
        .replace(/(([^,]+,)\2+)/g,'[$1],')
        .replace(/,(]|$)/g,'$1')
    + "]";

JSON.parse(result)轉爲數組對象,打印便可

正則表達式

經過解法二,咱們有時候面對一些問題,其實還有更簡單的解決方法

下面再補充一下正則的知識點

元字符

.replace(/((\[^,]+,)\2+)/g,'[$1],')中,正則部分是/((\[^,]+,)\2+)/g

其中最前面的「/」與最後面的「/」是分隔符,表示正則表達式的開始與結束.

這裏再補充元字符的說明

代碼 含義
. 匹配除換行符之外的任意字符
\w 匹配字母或數字或下劃線或漢字
\W 匹配任意不是字母或數字或下劃線或漢字的字符
\s 匹配任意的空白符
\S 匹配任意非空白符
\d 匹配數字
\D 匹配非數字
\b 匹配單詞的開始或結束
^ 匹配字符串的開始
$ 匹配字符串的結束

標誌

最後的「g」標誌表示正則表達式使用的global(全局)的狀態.使用 global 標誌代表在被查找的字符串中搜索操做將查找全部符合的項,而不單單是第一個.這也被稱爲全局匹配.【相關的標誌還有i(ignoreCase,表示忽略大小寫)、m(multiline,表示容許跨行)】,以下表所示

補充一下標誌

標誌 描述
g 全局搜索
i 不區分大小寫搜索
m 多行搜索
y 執行「粘性」搜索,匹配從目標字符串的當前位置開始,可使用y標誌

限定符

而後咱們再來看中間的主體部分((\[^,]+,)\2+)

字符組就是在[](方括號)中列舉出全部的可能再去匹配,+是指匹配前面一個表達式1次或者屢次,

補充一下限定符

代碼 含義
* 復零次或更屢次
+ 重複一次或更屢次
? 重複零次或一次
{n} 重複n次
{n,} 重複n次或更屢次
{n,m} 重複n到m次

.replace(/((\[^,]+,)\2+)/g,'[$1],')中的$1匹配到的部分的替換,替換成[$1],

匹配的部分,值得是兩個以上相同的值

.replace(/,(]|$)/g,'$1')就是去,]裏的,

寫得好亂···

我這篇文章也用到了對URL的正則匹配

相關文章
相關標籤/搜索