前端正則總結(jié)及應用

就是一個規(guī)則效拭,用來處理字符串的一個規(guī)則(正則就是用來處理字符串的)
  • API
    * test
    *   判斷一個字符串是否符合我們制定的規(guī)則 reg.test(str);    返回布爾值
    * exec
    *   把字符串中符合我們正則的內(nèi)容捕捉到 res=reg.exec('12345a123')  返回匹配到的內(nèi)容
正則的元字符和簡單應用

每個正則表達式都是由元字符和修飾符組成的

  • 常用的元字符
       \       轉(zhuǎn)譯字符
       ^       以某個元字符開始
       $       以某個元字符結(jié)尾
       *       出現(xiàn)0次到多次
       +       出現(xiàn)一次到多次
       ?       出現(xiàn)0次或1次
       {n}     出現(xiàn)N次
       {n,}    出現(xiàn)至少N次
       {n,m}   出現(xiàn)N次到M次
       .       除了\n
       ()      分組把一個大正則劃分成幾個小正則
       X|Y     X或Y的一個
       [XYZ]   XYZ中的一個
       [^XYZ]  除了XYZ
       [A-Z]   A-Z中的一個
       [^A-Z]  除了A-Z之間的任意一個
       \d      一個0--9之間的數(shù)字
       \b      一個邊界符 單詞兩邊的空格 邊界
       \w      數(shù)字 字母 下劃線 任意一個字符
       \s      匹配一個空白字符 空格 換行符 換頁符等
  • 常用的修飾符
    * g   全局匹配
    * i   不區(qū)分大小寫
    * m   多行匹配
懶惰性和貪婪性
  • 正則的捕捉
exec
    捕捉的內(nèi)容格式
         * 捕捉的內(nèi)容是一個數(shù)組
         * 數(shù)組的第一項是當前正則捕獲
         * index 捕獲內(nèi)容在字符串中開始的索引位置
         * input 捕捉的原始字符串
         * 每一次捕捉的時候都是進行默認的匹配按灶,如果沒有匹配成功的 捕獲的結(jié)果是null 只有匹配到的內(nèi)容才會捕捉到
  • 正則捕捉的特點

懶惰性--就是只會找一處婴谱,找到一處就不在找了

  • 每一次執(zhí)行exec只能捕獲一個匹配的內(nèi)容佩耳,在不進行處理的情況下润绎,再執(zhí)行多次捕獲匙铡,捕獲的還是一個匹配的內(nèi)容
  • lastIndex:是正則每一次捕捉在字符串中開始查找到額位置拧咳,默認值是0伯顶,每一次捕捉都是從字符串0索引開始查找
  • 解決正則的懶惰性----在正則的末尾加修飾符’g‘
    var reg=/\d+/g
    var res=reg.exec('12345a123');
    var arr=[]
    while(res){
        arr.push(res[0])
        res=reg.exec('12345a123')
    }
    arr  //["12345", "123"]
    res  //null  因為查到最后一個沒有了就是null
  • 注:字符串中的match方法
  • 把所有和正則匹配的字符都獲取到
  • 雖然在當前情況下match會比exec更簡便,但是match存在一些自己處理不了的問題骆膝,在分組情況下祭衩,match只能捕獲大正則匹配的內(nèi)容
  • 而對于小正則匹配的內(nèi)容是無法獲取的

貪婪性--正則的每次捕獲都是按照最長的結(jié)果捕獲的

解決正則的貪婪性---在量詞元字符后面添加一個?即可

  • 阅签? 在正則中的作用
           <1>放在普通元字符后邊表示出現(xiàn)0--1次
           <2>/\d?/ 表示數(shù)字可能出現(xiàn)也可能不出現(xiàn)
           <3>放在一個量詞后邊是取消捕捉時候的貪婪性
           <4>小正則  (?:)職匹配不捕獲
正則分組 掐暮、
*正則內(nèi) \1 代表復制分組的第一個小正則
  • 正則分組作用
    *   1. 改變優(yōu)先級
    *   2. 分組引用
    *   3. \2代表和第2個分組一模一樣,\1代表和第1個分組一模一樣政钟。路克。。
    *   var reg=/^(\w)\1(\w)\2/   console.log(reg.test('wwcc'))  ---->true
分組捕獲
  • 正則捕獲的時候不僅僅把大正則匹配的內(nèi)容捕獲得到 還可以吧小正則匹配的內(nèi)容捕捉到
    * var reg=/^(\d{2})(\d{4})/
    * var str='123456'
    * var arg=reg.exec(str);
    * arg[0]   大正則匹配的內(nèi)容
    * arg[1]   小正則第一個分組匹配的內(nèi)容
正則分組捕獲.png
字符串的方法 replace养交、RegExp.$1得到第一分組內(nèi)容
  • 將原有的字符串換成新的字符精算,在不是用正則的情況下,每執(zhí)行一次替換一處
     * replace 第一項的值是一個正則碎连,實現(xiàn)原理
     *   首先和exec一樣灰羽,把所有和我們正則匹配的 都捕獲到,然后把捕獲的內(nèi)容替換成我們需要替換的新內(nèi)容
     *   str=str.replace(/ba/g,function(){
           console.log(arguments);//每一次arguments的值和/ba/g.exec(str)獲取的值是一樣的
           利用argument可以拿到分組中的所有內(nèi)容鱼辙,為我所用
           return bawuzhan;     //把匹配到的都替換為return的東西
     *   })
     *  返回一個替換后的新字符串
     * 解釋:
     *   1.匿名函數(shù)執(zhí)行多少次廉嚼,取決于正則在字符串中捕獲多少次
     *   2.每一次執(zhí)行匿名函數(shù),里面?zhèn)鬟f的參數(shù)值arguments和通過exec捕獲到的結(jié)果非常相似
     * (即使正則有分組倒戏,我們同樣可以通過arguments獲取分組捕獲的內(nèi)容)
     *   3.return 返回的結(jié)果是啥前鹅,就相當于這一次大正則 捕獲的內(nèi)容替換成返回的內(nèi)容
     *   arguments[0]每一次執(zhí)行匿名函數(shù)都可以把替換內(nèi)容獲取到
     *   arguments[1]每一次執(zhí)行匿名函數(shù),正則捕獲到第一個小正則的內(nèi)容 
    
*RegExp.$1 獲取第一個小正則分組內(nèi)容
正則應用
  1. 將小寫數(shù)字換成中文數(shù)字
var strList=['零','壹','貳','叁','肆','伍','陸','柒','捌','玖']
    var num='8962738';
    num=num.replace(/\d/g,function(){
        if(arguments[0]) {
            return strList[arguments[0]];
        }
    })
    console.log(num)
  1. 獲取一個字符串中出現(xiàn)最多次數(shù)的字符和出現(xiàn)的次數(shù)
var str='拉拉手哈哈啊啊啊哈阿是哦掃啊啊手啊啊';
    var obj={};
    str.replace(/\S/g,function(){
        var val=arguments[0];
        obj[val]>=1?obj[val]+=1:obj[val]=1
    })
    console.log(obj)

or

for(var i=0;i<str.length;i++){
        var cur=str[i];
        console.log(cur)
        if(obj[cur]>=1){
            obj[cur]++;
        }else{
            obj[cur]=1;
        }
    }
 console.log(obj)
var max=0;
for(var k in obj){
  if(obj[k]>max){
    max=obj[k];
  }
}
console.log(max);
var ary=[];
for(var key in obj){
  obj[key]==max?ary.push(key):null;
}
console.log(ary);
  1. 把url中的參數(shù)都獲取到 并且保存成一個對象
var obj={};
    var reg=/([^?=&]+)=([^?=&]+)/g;
    str.replace(reg, function () {
        obj[arguments[1]]=arguments[2]
    })
console.log(obj)
  1. 時間字符串格式化
String.prototype.myFormatTime=function(){
        var reg=/^(\d{4})(?:-|\/|\.|:)(\d{1,2})(?:-|\/|\.|:)(\d{1,2})(?:\s+)(\d{1,2})(?:-|\/|\.|:)(\d{1,2})(?:-|\/|\.|:)(\d{1,2})$/g;
        // (?:-|\/|\.|:) 表示匹配但是不捕獲 - \ . : 這幾個分隔符
        var ary=[];
        this.replace(reg,function(){
            ary=([].slice.call(arguments)).slice(1,7);//獲取小分組的時間
        })
        var format=arguments[0]||'{0}年{1}月{2}日 {3}:{4}:{5}';
        return format.replace(/{(\d+)}/g,function(){
            var val=ary[arguments[1]];
            return val.length==1?"0"+val:val
        })
    }
    var str ="2017.5.18  14:53:0";
    console.log(str.myFormatTime('{0}年{1}月'))
    console.log(str.myFormatTime('{0}/{1}/{2} {3}:{4}:{5}'));
    console.log(str.myFormatTime('{0}-{1}-{2} {3}:{4}:{5}'));
    console.log(str.myFormatTime());

常用的正則

//正整數(shù)
/^[0-9]*[1-9][0-9]*$/;
//負整數(shù)
/^-[0-9]*[1-9][0-9]*$/;
//正浮點數(shù)
/^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$/;   
//負浮點數(shù)
/^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$/;  
//浮點數(shù)
/^(-?\d+)(\.\d+)?$/;
//email地址
/^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/;
//url地址
/^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$/;
或:^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$ 
//年/月/日(年-月-日峭梳、年.月.日)
/^(19|20)\d\d[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])$/;
//匹配中文字符
/[\u4e00-\u9fa5]/;
//匹配帳號是否合法(字母開頭舰绘,允許5-10字節(jié)蹂喻,允許字母數(shù)字下劃線)
/^[a-zA-Z][a-zA-Z0-9_]{4,9}$/;
//匹配空白行的正則表達式
/\n\s*\r/;
//匹配中國郵政編碼
/[1-9]\d{5}(?!\d)/;
//匹配身份證
/\d{15}|\d{18}/;
//匹配國內(nèi)電話號碼
/(\d{3}-|\d{4}-)?(\d{8}|\d{7})?/;
//匹配IP地址
/((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)/;
//匹配首尾空白字符的正則表達式
/^\s*|\s*$/;
//匹配HTML標記的正則表達式
< (\S*?)[^>]*>.*?|< .*? />;
//sql 語句
^(select|drop|delete|create|update|insert).*$
//提取信息中的網(wǎng)絡鏈接
(h|H)(r|R)(e|E)(f|F) *= *('|")?(\w|\\|\/|\.)+('|"| *|>)? 
//提取信息中的郵件地址
\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* 
//提取信息中的圖片鏈接
(s|S)(r|R)(c|C) *= *('|")?(\w|\\|\/|\.)+('|"| *|>)? 
//提取信息中的 IP 地址
(\d+)\.(\d+)\.(\d+)\.(\d+)
//取信息中的中國手機號碼
(86)*0*13\d{9} 
//提取信息中的中國郵政編碼
[1-9]{1}(\d+){5} 
//提取信息中的浮點數(shù)(即小數(shù))
(-?\d*)\.?\d+ 
//提取信息中的任何數(shù)字
(-?\d*)(\.\d+)?
//電話區(qū)號
^0\d{2,3}$
//騰訊 QQ 號
^[1-9]*[1-9][0-9]*$ 
//帳號(字母開頭,允許 5-16 字節(jié)捂寿,允許字母數(shù)字下劃線)
^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 
//中文口四、英文、數(shù)字及下劃線
^[\u4e00-\u9fa5_a-zA-Z0-9]+$
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末秦陋,一起剝皮案震驚了整個濱河市蔓彩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌驳概,老刑警劉巖赤嚼,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異顺又,居然都是意外死亡更卒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門稚照,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蹂空,“玉大人,你說我怎么就攤上這事果录∩险恚” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵弱恒,是天一觀的道長辨萍。 經(jīng)常有香客問我,道長返弹,這世上最難降的妖魔是什么锈玉? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮琉苇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘悦施。我一直安慰自己并扇,他們只是感情好,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布抡诞。 她就那樣靜靜地躺著穷蛹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪昼汗。 梳的紋絲不亂的頭發(fā)上肴熏,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天,我揣著相機與錄音顷窒,去河邊找鬼蛙吏。 笑死源哩,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的鸦做。 我是一名探鬼主播励烦,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼泼诱!你這毒婦竟也來了坛掠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤治筒,失蹤者是張志新(化名)和其女友劉穎屉栓,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體耸袜,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡盏求,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了雾叭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片料身。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖胰锌,靈堂內(nèi)的尸體忽然破棺而出骗绕,到底是詐尸還是另有隱情,我是刑警寧澤资昧,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布酬土,位于F島的核電站,受9級特大地震影響格带,放射性物質(zhì)發(fā)生泄漏撤缴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一叽唱、第九天 我趴在偏房一處隱蔽的房頂上張望屈呕。 院中可真熱鬧,春花似錦棺亭、人聲如沸虎眨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嗽桩。三九已至,卻和暖如春凄敢,著一層夾襖步出監(jiān)牢的瞬間碌冶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工涝缝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留扑庞,地道東北人譬重。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像嫩挤,于是被迫代替她去往敵國和親害幅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容