1. 程式人生 > 實用技巧 >正則表示式元字元(精華版)

正則表示式元字元(精華版)

正則表示式分為元字元和修飾符,修飾符有三個,本文中說說對於元字元的理解。

  1. . 萬用字元, 匹配任何一個字元
    變為字元的方法: 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. \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]
  1. ^開始 $結束
    要完成一個全體內容匹配就需要使用起始和結束符來操作 : 例如表輸入框
console.log("bbaacc".match(/^a+/g));//  要求起始就需要是一個a以上
console.log("bbaacc".match(/c+$/g));//  要求必須以某個字元結束

12.| 或者(選擇) || 兩個||中間表示空字元 是按照順序查詢的

console.log("abcd".match(/ab||cd/g));  // ["ab", "", "", ""]
  1. 斷言
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

花了幾個小時時間,只整理成了這個樣子,真心累,發現了好多以前沒注意到的地方。

正則表示式的作用很廣泛,每門語言都有自己處理字串的名字,但是方法總的來說,就是這些。

我是做前端的,所以只整理了關於js的方法,但是殊途同歸。整理的沒有多好,只是些簡單的使用方法和

認識,希望這幾個小時的時間沒有白費,可以為看到這篇文章的各位提供幫助。

第9點應用到了replace的方法,這也是replace的第三種使用方法,關於前兩種使用方法,在我前面的一篇文章。

https://www.cnblogs.com/94-Lucky/p/13356817.html