正則表示式元字元(精華版)
阿新 • • 發佈:2020-07-21
正則表示式分為元字元和修飾符,修飾符有三個,本文中說說對於元字元的理解。
- . 萬用字元, 匹配任何一個字元
變為字元的方法: a.放在[]中 b.. 利用轉義字元
var str="catcbtc/tc1tc.tcabt"; console.log(str.match(/c.t/g)); //["cat", "cbt", "c/t", "c1t", "c.t"] console.log(str.match(/c\.t/g)); //[c.t] console.log(str.match(/c[.]t/g)); //[c.t]
2.[] 或者符,匹配其中任意一個
var str="catcbtc/tc1tc.tcabt";
console.log(str.match(/c[abcdefghi]t/g)) //["cat", "cbt"]
console.log(str.match(/c[a-i]t/g)) //["cat", "cbt"]
應用舉例
var str="中國四大古典名著有'西遊記','紅樓夢','水滸','三國演義'"; str=str.replace(/'/g,function(item){ return n++%2===0 ? "《" : "》"; }); console.log(str); //"中國四大古典名著有《西遊記》,《紅樓夢》,《水滸》,《三國演義》" str=str.replace(/[《》]/g,function(item){ return item==="《" ? "<" : ">"; }); console.log(str); //"中國四大古典名著有<西遊記>,<紅樓夢>,<水滸>,<水滸>"
3.\ 相當於\字元
兩個\ 在字元或者正則表示式的[]都是一個\
console.log("aa\\a\a".match(/[\\]/g)) // ["\"]
4.^ 不要後面的字元,但只能在[]的第一個字元位置才起此作用,在中間位置,作為字元的作用
console.log("abc^def".match(/[^\^]/g));// ["a", "b", "c", "d", "e", "f"] 不要^
5.貪婪匹配
console.log("aaaaaaa".match(/a{1,4}/g)); // ["aaaa", "aaa"] 先匹配最大的字串 貪婪匹配
console.log("aaaaaaa".match(/a{0,3}/g)) // ["aaa", "aaa", "a", ""] 因為0是最小,匹配空字元
7.簡寫
a:常規簡寫
1)\w [a-zA-Z0-9_] \W [^a-zA-Z0-9_]
2)\d [0-9] \D [^0-9]
3)\s 空字元 \S 不要空字元
//大寫和小寫是相反的
b:貪婪匹配簡寫
1)* /a*/g /a{0,}/g 可以沒有,可以有若干個
2)+ /a+/g /a{1,}/g 匹配至少1個也可以多個
3)? /a?/g /a{0,1}/g 可以有也可以沒有
8.非貪婪匹配
和貪婪匹配的區別: 區分符號為 ? 當使用了貪婪匹配,也就是字元重複了,後面加 ? ,就是非貪婪,選取最小的
常見: *? +? {3,}?
例如:
var str = "<p>Uber的這款無人車原型配備了多個<strong>攝像頭</strong>、<em>鐳射雷達</em>以及<span>感測器</span>,可看清100米範圍內任何方向的東西</p><br/><p>第二行內容,哎嘿,第二行內容</p>";
str=str.replace(/<.*?>/g,function(item){
if(item==="<br/>") return "\n";
return "";
});
console.log(str); // 去掉所有的標籤 換行
9.() 群組
1)當使用match時,如果使用群組,加上g和不加g是有差距
不加g可以將每個()群組的內容單獨拿出來,在陣列中按照順序從下標1 開始放置
加g就不能找到群組內容,只有滿足正則的內容,()內的內容不能查詢
console.log("10[a]3[bc]".match(/(\d+)\[([a-zA-Z]+)\]/g)) // ["10[a]", "3[bc]"]
console.log("10[a]3[bc]".match(/(\d+)\[([a-zA-Z]+)\]/g)) //["10[a]", "10", "a", index: 0, input: "10[a]3[bc]", groups: undefined]
2)在replace中如果不使用群組,後面的函式中引數第一位時符合正則內容,第二位是這個字元的下標
使用了群組,後面的函式中引數分別是符合正則的內容,和每個群組的內容
var str="10[a]3[bc]".replace(/(\d+)\[([a-zA-Z]+)\]/g,function(item1,item2,item3){
return item3.repeat(item2); // 把item3重複item2個數量,這裡 item2對應的是 10 3 item3對應的是 a bc ,然後替換item1,也就是滿足正則的內容
}
console.log(str) //aaaaaaaaaabcbcbc
//替換字元內容
var str="background-position-x".replace(/-([a-z])/g,function(item,item1){
return item1.toUpperCase();
});
console.log(str); // backgroundPositionX
//隱藏手機號
var str="13879061235".replace(/(\d{3})\d{4}(\d{4})/,"$1****$2");
console.log(str); //138****1235 群組會預設按照順序把內容 賦予變數,只能使用$1,$2....等
- \1 重複
變成陣列,排序,轉回字串,查詢重複字元
用法: ([a-z])\1* ([a-z])\1+
var str="aaabbffddeeaaggfddssaaggeer".split("").sort().join("").match(/(\w)\1*/g).reduce(function(value,item){
value+=item[0]+"["+item.length+"]";
return value;
},"")
console.log(str); // a[7]b[2]d[4]e[4]f[3]g[4]r[1]s[2]
- ^開始 $結束
要完成一個全體內容匹配就需要使用起始和結束符來操作 : 例如表輸入框
console.log("bbaacc".match(/^a+/g));// 要求起始就需要是一個a以上
console.log("bbaacc".match(/c+$/g));// 要求必須以某個字元結束
12.| 或者(選擇) || 兩個||中間表示空字元 是按照順序查詢的
console.log("abcd".match(/ab||cd/g)); // ["ab", "", "", ""]
- 斷言
a(?=b) 前瞻斷言 查詢後面緊跟b的a字元
a(?!b) 前瞻斷言 查詢後面沒有緊跟b的a字元
(?<=a)b 後瞻斷言 查詢前面是a的b字元
(?<!a)b 後瞻斷言 查詢前面沒有a的b字元
console.log("abac".replace(/a(?=b)/g,"z")); // zbac
console.log("abac".replace(/a(?!b)/g,"z")); // abzc
console.log("abcb".replace(/(?<=a)b/g,"z")); //azcb
console.log("abcb".replace(/(?<!a)b/g,"z")); //abcz