【前端 JavaScript 高級】04 - 正則表達(dá)式

1. 正則表達(dá)式概述

1.1 什么是正則表達(dá)式

  1. 正則表達(dá)式( Regular Expression )是用于匹配字符串中字符組合的模式担忧。在JavaScript中枕面,正則表達(dá)式也是對象挠蛉。

  2. 正則表通常被用來檢索、替換那些符合某個模式(規(guī)則)的文本,例如驗證表單:用戶名表單只能輸入英文字母逮壁、數(shù)字或者下劃線颓遏, 昵稱輸入框中可以輸入中文(匹配)徐矩。此外,正則表達(dá)式還常用于過濾掉頁面內(nèi)容中的一些敏感詞(替換)叁幢,或從字符串中獲取我們想要的特定部分(提取)等 滤灯。

  3. 其他語言也會使用正則表達(dá)式,本階段我們主要是利用JavaScript 正則表達(dá)式完成表單驗證曼玩。

1.2 正則表達(dá)式的特點

  1. 靈活性鳞骤、邏輯性和功能性非常的強。

  2. 可以迅速地用極簡單的方式達(dá)到字符串的復(fù)雜控制黍判。

  3. 對于剛接觸的人來說豫尽,比較晦澀難懂。比如:^\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*$顷帖。

  4. 實際開發(fā),一般都是直接復(fù)制寫好的正則表達(dá)式. 但是要求會使用正則表達(dá)式并且根據(jù)實際情況修改正則表達(dá)式. 比如用戶名: /^[a-z0-9_-]{3,16}$/美旧。

2. 正則表達(dá)式在js中的使用

2.1 正則表達(dá)式的創(chuàng)建

JavaScript中,可以通過兩種方式創(chuàng)建一個正則表達(dá)式窟她。
  1. 方式一:通過調(diào)用 RegExp 對象的構(gòu)造函數(shù)創(chuàng)建 陈症。
var regexp = new RegExp(/123/);
console.log(regexp);
  1. 方式二:利用字面量創(chuàng)建 正則表達(dá)式。
 var rg = /123/;

2.2 測試正則表達(dá)式

  1. test()正則對象方法震糖,用于檢測字符串是否符合該規(guī)則录肯,該對象會返回 truefalse,其參數(shù)是測試字符串吊说。
var rg = /123/;
console.log(rg.test(123));//匹配字符中是否出現(xiàn)123  出現(xiàn)結(jié)果為true
console.log(rg.test('abc'));//匹配字符中是否出現(xiàn)123 未出現(xiàn)結(jié)果為false

3 正則表達(dá)式中的特殊字符

3.1 正則表達(dá)式的組成

  1. 一個正則表達(dá)式可以由簡單的字符構(gòu)成论咏,比如 /abc/ 优炬,也可以是簡單和特殊字符的組合,比如 /ab*c/ 厅贪。其中特殊字符也被稱為元字符蠢护,在正則表達(dá)式中是具有特殊意義的專用符號,如 ^ 养涮、$ 葵硕、+ 等。
  1. 特殊字符非常多贯吓,可以參考: MDN

  2. [正則測試工具]( <http://tool.oschina.net/regex);

3.2 邊界符

  1. 正則表達(dá)式中的邊界符(位置符)用來提示字符所處的位置懈凹,主要有兩個字符。
邊界符 說明
^ 表示匹配行首的文本(以誰開始)
$ 表示匹配行尾的文本(以誰結(jié)束)
  1. 如果^$ 在一起悄谐,表示必須是精確匹配介评。
// 正則表達(dá)式不需要使用引號引起來,不管是數(shù)字型還是字符串型
  // 邊界符 ^ $
  let reg = /abc/; // 正則表達(dá)式里面不需要加引號 不管是數(shù)字型還是字符串型
  // /abc/ 表示只要包含 abc字符串的字符串都可以
  console.log(reg.test('abc')); // true
  console.log(reg.test('abcd')); // true
  console.log(reg.test('aabcd')); // true

  let rg = /^abc$/;
  console.log(rg.test('abc')); // true
  console.log(rg.test('abcd')); // false
  console.log(rg.test('aabcd')); // false
  console.log(rg.test('abcabc')); // false

3.3 字符類

  1. 字符類表示有一系列字符可供選擇,只要匹配其中一個就可以了爬舰。所有可供選擇的字符都放在方括號內(nèi)们陆。
[ ] 方括號
  1. 表示有一系列字符可供選擇,只要匹配其中一個就可以了:

  // 字符類:[] 表示有一系列的字符是可以選擇的情屹,只要匹配其中一個就可以了
  let rg = /[abc]/;// 只要包含有a或者b包含有c都會返回true 不管是在任何位置
  console.log(rg.test('abc')); // true
  console.log(rg.test('block')); // true
  console.log(rg.test('color')); // true
  console.log(rg.test('double')); // true
  console.log(rg.test('free')); // false

  let reg = /^[abc]$/; // 三選一 只有是 a 或者 b 或者 c 這三個字母中其中一個才會返回 true
  console.log(reg.test('a')); // true
  console.log(reg.test('b'));// true
  console.log(reg.test('c')); // true
  console.log(reg.test('d'));// false


  // 特殊字符 - 連接符
  let r = /^[a-z]$/; // 26個英文字母中的其中一個
  console.log(r.test('a')); // true
  console.log(r.test('r')); // true
  console.log(r.test('1')); // false
 // 26個英文字母的大寫和小寫
  let reg = /^[a-zA-Z_-]$/;
  console.log(reg.test('a')); // true
  console.log(reg.test('B')); // true
  console.log(reg.test('6')); // false
  console.log(reg.test('-')); // true
  console.log(reg.test('_')); // true

  // 如果中括號里面有 ^  表示取反的意思
  let rg = /^[^a-zA-Z_-]$/; // 小括號里面的 ^ 代表取反的意思
  console.log(rg.test('a')); // false
  console.log(rg.test('B')); // false
  console.log(rg.test('6')); // true
  console.log(rg.test('-')); // false
  console.log(rg.test('_')); // false
量詞符
  1. 量詞符用來設(shè)定某個模式出現(xiàn)的次數(shù)坪仇。
量詞 說明
* 重復(fù)0次或更多次
+ 重復(fù)1次或更多次
? 重復(fù)0次或1次
{n} 重復(fù)n次
{n,} 重復(fù)n次或更多次
{n,m} 重復(fù)n到m次
 // 量詞符 :用來設(shè)定某個模式出現(xiàn)次數(shù)

  // 簡單理解 :就是讓下面的a這個字符重復(fù)多少次

  //  * 相當(dāng)于 >= 0 可以出現(xiàn)0次或者很多次
  let reg = /^a*$/;
  // console.log(reg.test('a'));// true
  // console.log(reg.test('')); // true
  // console.log(reg.test('aaaaaaaaaaa')); // true
  // console.log(reg.test('b')); // false
  // console.log(reg.test('bbbbbb')); // false

  // + 相當(dāng)于 >= 1可以 出現(xiàn)1次或者1次以上
  let rg = /^a+$/;
  // console.log(rg.test('a')); // true
  // console.log(rg.test('')); // false
  // console.log(rg.test('bbb')); // false
  // console.log(rg.test('aaaaaaaaa')); // true

  // ? 相當(dāng)于 1 || 0 出現(xiàn) 0 次 或者是 1 次
  let r = /^a?$/;
  // console.log(r.test('a')); // true
  // console.log(r.test('')); // true
  // console.log(r.test('aaaa')); // false

  // {} 剛好3次
  let rr = /^a{3}$/;
  // console.log(rr.test('aaaa')); // false
  // console.log(rr.test('aaa')); // true
  // console.log(rr.test('aa')); // false

  // 大于等于 3次
  let rrr = /^a{3,}$/;
  // console.log(rrr.test('aaaa')); // true
  // console.log(rrr.test('aaa')); // true
  // console.log(rrr.test('aa')); // false

  // 大于等于 3次  小于等于 6 次
  let rrrr = /^a{3,6}$/;
  console.log(rrrr.test('aaaaaaaa')); // false
  console.log(rrrr.test('aaaaaa')); // true
  console.log(rrrr.test('aa')); // false
  console.log(rrrr.test('aaa')); // true
  1. 量詞符設(shè)定某個模式出現(xiàn)的次數(shù)。
  // 量詞設(shè)定某個模式出現(xiàn)的次數(shù)
  let reg = /^[a-zA-Z0-9_-]$/; // 這個模式用戶只能輸入英文字母數(shù)字下劃線短橫線但是有邊界符和 [] 這就限定了只能多選 1
  // console.log(reg.test('a')); // true
  // console.log(reg.test('aaa')); // false
  // console.log(reg.test('8')); // true
  // console.log(reg.test('888')); // false

  // {6,16} 量詞中間不能有空格
  let rg = /^[a-zA-Z0-9_-]{3,16}$/; // 注意 {6,16} 量詞中間不能有空格
  console.log(rg.test('andy_red')); // true
  console.log(rg.test('andy_color')); // true
  console.log(rg.test('andy_blue')); // true
  console.log(rg.test('andy_b3666')); // true
  console.log(rg.test('andy_b--66')); // true
  console.log(rg.test('andy_b--66**')); // false

案例用戶名表單驗證

功能需求:
  1. 如果用戶名輸入合法, 則后面提示信息為: 用戶名合法,并且顏色為綠色屁商;

  2. 如果用戶名輸入不合法, 則后面提示信息為: 用戶名不符合規(guī)范, 并且顏色為紅色烟很;

用戶名合法
用戶名不合法
分析:
  1. 用戶名只能為英文字母,數(shù)字,下劃線或者短橫線組成, 并且用戶名長度為6~16位。

  2. 首先準(zhǔn)備好這種正則表達(dá)式模式/$[a-zA-Z0-9-_]{6,16}^/蜡镶。

  3. 當(dāng)表單失去焦點就開始驗證.雾袱。

  4. 如果符合正則規(guī)范, 則讓后面的span標(biāo)簽添加right類。

  5. 如果不符合正則規(guī)范, 則讓后面的 span 標(biāo)簽添加 wrong類官还。

代碼實現(xiàn)
  1. CSS芹橡。
 .right {
      color: #00ff00;
    }

    .wrong {
      color: #f00;
    }
  1. html
<input type="text" class="uname"><span>請輸入用戶名</span>
  1. javascript
  let input = document.querySelector('.uname');
  let span = document.querySelector('span');
  let reg = /^[a-zA-Z0-9_-]{3,16}$/; // 用戶名驗證正則表達(dá)式

  /**
   * 當(dāng)鼠標(biāo)失去焦點的時候
   */
  input.addEventListener('blur', () => {
    // 獲取到輸入框中的值
    let iptVal = input.value;
    if (reg.test(iptVal)) {
      span.innerHTML = '用戶名格式正確!';
      span.className = 'right';
    } else {
      span.innerHTML = '用戶名格式不正確!';
      span.className = 'wrong';
    }
  });
括號總結(jié)
  1. 大括號 量詞符. 里面表示重復(fù)次數(shù);

  2. 中括號 字符集合。匹配方括號中的任意字符;

  3. 小括號表示優(yōu)先級望伦。

3.4 預(yù)定義類

  1. 預(yù)定義類指的是某些常見模式的簡寫方式林说。
預(yù)定義類
案例:驗證座機號碼
// 正則表達(dá)式里面的或者符號是 | 一個豎線
  let rg = /^\d{3}-\d{8}|\d{4}-\d{7}$/;

3.5 表單驗證案例

  1. 手機號驗證:
//手機號驗證:/^1[3|4|5|7|8][0-9]{9}$/;
//驗證通過與不通過更換元素的類名與元素中的內(nèi)容
 if (reg.test(this.value)) {
    // console.log('正確的');
    this.nextElementSibling.className = 'success';
    this.nextElementSibling.innerHTML = '<i class="success_icon"></i> 恭喜您輸入正確';
   } else {
       // console.log('不正確');
      this.nextElementSibling.className = 'error';
      this.nextElementSibling.innerHTML = '<i class="error_icon"></i>格式不正確,請從新輸入 ';
 }
  1. QQ號驗證:
//QQ號驗證: /^[1-9]\d{4,}$/; 
//昵稱驗證:/^[\u4e00-\u9fa5]{2,8}$/
//驗證通過與不通過更換元素的類名與元素中的內(nèi)容 ,將上一步的匹配代碼進(jìn)行封裝,多次調(diào)用即可
 function regexp(ele, reg) {
    ele.onblur = function() {
      if (reg.test(this.value)) {
        // console.log('正確的');
        this.nextElementSibling.className = 'success';
        this.nextElementSibling.innerHTML = '<i class="success_icon"></i> 恭喜您輸入正確';
   } else {
     // console.log('不正確');
     this.nextElementSibling.className = 'error';
     this.nextElementSibling.innerHTML = '<i class="error_icon"></i> 格式不正確,請從新輸入 ';
            }
        }
 };
//密碼驗證:/^[a-zA-Z0-9_-]{6,16}$/
//再次輸入密碼只需匹配與上次輸入的密碼值 是否一致

3.6 正則替換replace

  1. replace() 方法可以實現(xiàn)替換字符串操作,用來替換的參數(shù)可以是一個字符串或是一個正則表達(dá)式屯伞。
var str = 'andy和red';
var newStr = str.replace('andy', 'baby');
console.log(newStr)//baby和red
//等同于 此處的andy可以寫在正則表達(dá)式內(nèi)
var newStr2 = str.replace(/andy/, 'baby');
console.log(newStr2)//baby和red
//全部替換
var str = 'abcabc'
var nStr = str.replace(/a/,'哈哈')
console.log(nStr) //哈哈bcabc
//全部替換g
var nStr = str.replace(/a/a,'哈哈')
console.log(nStr) //哈哈bc哈哈bc
//忽略大小寫i
var str = 'aAbcAba';
var newStr = str.replace(/a/gi,'哈哈')//"哈哈哈哈bc哈哈b哈哈"
  1. 案例:敏感詞過濾
<textarea name="" id="message"></textarea> <button>提交</button>
<div></div>
<script>
    var text = document.querySelector('textarea');
    var btn = document.querySelector('button');
    var div = document.querySelector('div');
    btn.onclick = function() {
        div.innerHTML = text.value.replace(/激情|gay/g, '**');
    }
</script>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末腿箩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子劣摇,更是在濱河造成了極大的恐慌珠移,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異钧惧,居然都是意外死亡暇韧,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門浓瞪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來懈玻,“玉大人,你說我怎么就攤上這事乾颁⊥课冢” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵钮孵,是天一觀的道長骂倘。 經(jīng)常有香客問我,道長巴席,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任诅需,我火速辦了婚禮漾唉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘堰塌。我一直安慰自己赵刑,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布场刑。 她就那樣靜靜地躺著般此,像睡著了一般。 火紅的嫁衣襯著肌膚如雪牵现。 梳的紋絲不亂的頭發(fā)上铐懊,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音瞎疼,去河邊找鬼科乎。 笑死,一個胖子當(dāng)著我的面吹牛贼急,可吹牛的內(nèi)容都是我干的茅茂。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼太抓,長吁一口氣:“原來是場噩夢啊……” “哼空闲!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起走敌,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤碴倾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體影斑,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡给赞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了矫户。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片片迅。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖皆辽,靈堂內(nèi)的尸體忽然破棺而出柑蛇,到底是詐尸還是另有隱情,我是刑警寧澤驱闷,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布耻台,位于F島的核電站,受9級特大地震影響空另,放射性物質(zhì)發(fā)生泄漏盆耽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一扼菠、第九天 我趴在偏房一處隱蔽的房頂上張望摄杂。 院中可真熱鬧,春花似錦循榆、人聲如沸析恢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽映挂。三九已至,卻和暖如春盗尸,著一層夾襖步出監(jiān)牢的瞬間柑船,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工振劳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留椎组,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓历恐,卻偏偏與公主長得像寸癌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子弱贼,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

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