這是一篇普通的教程,同時也是個人一篇筆記。原由是看到一道題目的另一種解法特別有意思,同時也作一點正則的筆記,好理解。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的正則匹配