let reg = /pattern/flags;
複製代碼
其中pattern(模式)是正則表達式的主體。flags(標記),用於控制正則表達式的行爲。flags的取值有如下幾種html
從這裏能夠看出,前邊圖中說元字符.
匹配除換行符以外的任何字符是不許確的。若是加上s標誌,則能夠匹配任意字符正則表達式
元字符共有14個,在使用的時候須要加上\進行轉義 {}[]()^$\|?*+.
數組
[-.]
表示符號-或者.號(注意這裏,在[]
中的.號表明的就是這個符號,可是若是在其外面,表示個匹配全部。 因此若是不在[]
之中,想要匹配'.',就要經過轉意符號.)[]
中,特殊字符不須要轉義,能夠直接使用,好比[.()]
,可是在外面,是須要轉義的( .等[]
中的^標識非,[]
外的^標識開頭標識[abc]
表示a或者b或者才,但/abc/
表示連續的abc字符(a|b)
,a或者b,對應[ab]
[]
中須要進行轉義的字符有[]^-
,其餘的元字符不須要轉義便可使用可參考 正則表達式之 \bmarkdown
reg.test(str)
返回值只多是false或者truereg.exec(str)
返回一個數組,數組的長度大於等於1,第一項是匹配的片斷,若是正則裏有分組(),則該數組從第二項依次是是
2,...分組匹配到的內容const str = '1234';
const reg1 = /\d{1}(\d{1})/g;//帶有g表示匹配字符串中的全部片斷
console.log(reg1.exec(str));//["12", "2", index: 0, input: "1234", groups: undefined]
console.log(reg1.exec(str));//["34", "4", index: 2, input: "1234", groups: undefined]
console.log(reg1.exec(str));//null
const reg2 = /\d{1}(\d{1})/;//不帶g,表示匹配到第一個知足的片斷,就再也不繼續匹配
console.log(reg2.exec(str));//["12", "2", index: 0, input: "1234", groups: undefined]
console.log(reg2.exec(str));//["12", "2", index: 0, input: "1234", groups: undefined]
複製代碼
須要注意帶有標識g和不帶標識g,exec會有不同的特性app
str.match(reg)
返回一個數組,須要注意g標識的區別const str = '1234';
const reg1 = /\d{1}(\d{1})/g;
const reg2 = /\d{1}(\d{1})/;
console.log(str.match(reg1));//["12", "34"]
console.log(str.match(reg2));//["12", "2", index: 0, input: "1234", groups: undefined]
複製代碼
str.repalce(reg, param)
返回一個新的字符串。param第二個參數能夠是一個字符串,或者一個返回替換內容的函數。str.split(param)
返回一個數組。param第二個參數能夠是一個字符串,或者一個正則表達式。const str = '1335555666617788884444';
const reg1 = /(?<=\d{3})\d{4}(?=\d{4})/g;
const reg2 = /(?<=\d{3})\d{4}(?=\d{4})/;
console.log(str.match(reg1));//"["5555", "6666", "1778"]"
console.log(str.replace(reg1,'****'));//"133************8884444"
console.log(str.replace(reg2,'****'));//"133****666617788884444"
複製代碼
replace
要替換的內容,和str.match(reg)
匹配到的內容是對應的。而str.match(reg)
和reg.exec(str)
效果又是類似的。函數
能夠從如下例子看出匹配過程工具
const str = '1335555666617788884444';
const reg1 = /(?<=\d{3})\d{4}(?=\d{4})/g;
let match;
console.log(reg1.lastIndex);//0
while(match !== null){
match = reg1.exec(str);
//每次進行一個exec,reg1的lastIndex會響應的增長,
//增長的值等於,匹配到的字符的位置+匹配字符的長度
console.log(match);//會打印出每次exec的匹配項
console.log(match && match.index, reg1.lastIndex);
//macth是匹配項在目標字符串str中的索引值
//reg1.lastIndex表示下一次匹配將從這個索引值的位置開始
}
複製代碼
打印結果以下oop
由此能夠得出結論。post
1335555666617788884444
最早被匹配到的內容是5555,字符串被替換爲133****666617788884444
這時,reg的lastIndex值再也不爲0,變爲7,下一次匹配會從索引值爲7的位置繼續匹配。8884444
再也不知足匹配規則,匹配完畢,reg的lastIndex值變爲0字符串1234
用/\d{1,3}/g
和/\d{1,3}?/g
匹配,會有不同的結果測試
const str = '1234';
const reg1 = /\d{1,3}/g;
const reg2 = /\d{1,3}?/g;
console.log(str.match(reg1));//["123","4"]
console.log(str.match(reg2));//["1","2","3","4"]
複製代碼
沒有加惰性符號?時,匹配默認是貪婪的,\d{1,3}匹配長度爲1-3的數字,貪婪的匹配時沒回都按最多的來,因此會有"123",加了?表明惰性匹配,按最少的來,因此會是"1"
再好比,咱們要匹配一個標籤中的href連接的話,則運用惰性標識?會頗有用
const str = '<a href="https://www.baidu.com" id="cscs" title="一個連接">測試文字</a>';
const reg1 = /".+"/g;
const reg2 = /".+?"/g;
console.log(str.match(reg1));//只匹配到1項
//["\"https://www.baidu.com\" id=\"cscs\" title=\"一個連接\""]
console.log(str.match(reg2));//匹配到3項
//["\"https://www.baidu.com\"", "\"cscs\"", "\"一個連接\""]
複製代碼
將一個金額11222333444轉爲11,222,333,444的形式;
const str = '111333222';
const reg1 = /(\d{1,3})(?=(\d{3})+$)/g;
const reg2 = /(\d)(?=(\d{3})+$)/g;
const reg3 = /(?<=\d)(?=(\d{3})+$)/g;
const str2 = str.replace(reg1, '$1,');
const str3 = str.replace(reg3, ',');
const str4 = str.replace(reg2, '$1,');
const str5 = str.replace(reg1, function(match){
return match+',';
});
console.log(str.match(reg1));//["11", "222", "333"]
console.log(str.match(reg2));// ["1", "2", "3"]
console.log(str.match(reg3));//["", "", ""]
console.log(str2);//11,222,333,444
console.log(str3);//11,222,333,444
console.log(str4);//11,222,333,444
console.log(str5);//11,222,333,444
複製代碼
/(?=(\d{3})+$)/g
則會存在缺陷,由於'111222333'.replace(/(?=(\d{3})+$)/g, ',');//,111,222,333
複製代碼
因此須要對前邊的字符進行限制
const str = 'get_my_color';
const str2 = str.replace(/_([a-z])/g, (item, $1) => $1.toUpperCase());
console.log(str2);
複製代碼
const str = '13311112222';
const str2 = str.replace(/(\d{3})(\d{4})(\d{4})/, '$1****$3');
const str3 = str.replace(/(\d{3})(?:\d{4})(\d{4})/, '$1****$2');
const str4 = str.replace(/(?<=\d{3})\d{4}(?=\d{4})/, '****');
console.log(str2);//133****2222
console.log(str3);//133****2222
console.log(str4);//133****2222
複製代碼
str2和str4匹配到的內容是不一樣的
這裏是對分組的應用例子
const str = 'aaabbbcccaaabbbaaa';
const str2 = str.split('').sort().join(''); //"aaaaaaaaabbbbbbccc"
const arr = str2.match(/(\w)\1+/g);//對\1的應用
arr.sort(function(a,b) {
return b.length - a.length;
});//按從大到小排序
console.log(arr);//["aaaaaaaaa", "bbbbbb", "ccc"]
console.log(arr[0]);//aaaaaaaaa
複製代碼
將qwer轉爲qwer*
const str = 'qwer';
const reg1 = new RegExp('', 'g');
const reg2 = /(?:)/g;
console.log(str.replace(reg1, '*'));//*q*w*e*r*
console.log(str.replace(reg2, '*'));//*q*w*e*r*
複製代碼
直接寫//g
匹配空字符是無效的
const str = 'https://pic2.zhimg.com/v2-5f03165aa5dff60d75c0f49f0ddd3db3_is.jpg?hhyr';
const reg1 = /(\.[A-z0-9]+$)|(\.[A-z0-9]+(?=\?\w+$))/;
const reg2 = /\.([A-z0-9]+)(\?\w*)?$/;
console.log(str.match(reg1)[0]);//.jpg
console.log(str.match(reg2)[1]);//jpg
複製代碼
let a = new WeakMap();
function getType(o) {
let str = Object.prototype.toString.call(o);
let reg = /\b\w+(?=\]$)/;
return str.match(reg)[0];
}
console.log(getType(a));//WeakMap
複製代碼
/[1-9]\d*/;//正整數 /-[1-9]\d*/;//負整數 /(-?[1-9]\d*)|0/;整數(正整數、負整數和0)
/[\u4e00-\u9fa5]/;中文字符
複製代碼
其餘的待整理
正則在線測試工具菜鳥工具