正則表達(dá)式

  • 了解正則表達(dá)式基本語法
  • 能夠使用JavaScript的正則對象

正則表達(dá)式簡介

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

正則表達(dá)式:用于匹配規(guī)律規(guī)則的表達(dá)式练链,正則表達(dá)式最初是科學(xué)家對人類神經(jīng)系統(tǒng)的工作原理的早期研究,現(xiàn)在在編程語言中有廣泛的應(yīng)用聚请。正則表通常被用來檢索、替換那些符合某個模式(規(guī)則)的文本姨伟。
正則表達(dá)式是對字符串操作的一種邏輯公式坞笙,就是用事先定義好的一些特定字符、及這些特定字符的組合氓辣,組成一個“規(guī)則字符串”,這個“規(guī)則字符串”用來表達(dá)對字符串的一種過濾邏輯袱蚓。

正則表達(dá)式的作用

  1. 給定的字符串是否符合正則表達(dá)式的過濾邏輯(匹配)
  2. 可以通過正則表達(dá)式钞啸,從字符串中獲取我們想要的特定部分(提取)
  3. 強(qiáng)大的字符串替換能力(替換)

正則表達(dá)式的特點(diǎn)

  1. 靈活性、邏輯性和功能性非常的強(qiáng)
  2. 可以迅速地用極簡單的方式達(dá)到字符串的復(fù)雜控制
  3. 對于剛接觸的人來說,比較晦澀難懂

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

  • 在線測試正則
  • 工具中使用正則表達(dá)式
    • sublime/vscode/word
    • 演示替換所有的數(shù)字

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

  • 普通字符abc 123
  • 特殊字符(元字符):正則表達(dá)式中有特殊意義的字符\d \w

示例演示:

  • \d 匹配數(shù)字
  • ab\d 匹配 ab1体斩、ab2

元字符

通過測試工具演示下面元字符的使用

常用元字符串

元字符 說明
\d 匹配數(shù)字
\D 匹配任意非數(shù)字的字符
\w 匹配字母或數(shù)字或下劃線
\W 匹配任意不是字母梭稚,數(shù)字,下劃線
\s 匹配任意的空白符
\S 匹配任意不是空白符的字符
. 匹配除換行符以外的任意單個字符
^ 表示匹配行首的文本(以誰開始)
$ 表示匹配行尾的文本(以誰結(jié)束)

限定符

限定符 說明
* 重復(fù)零次或更多次
+ 重復(fù)一次或更多次
? 重復(fù)零次或一次
{n} 重復(fù)n次
{n,} 重復(fù)n次或更多次
{n,m} 重復(fù)n到m次

其它

[] 字符串用中括號括起來絮吵,表示匹配其中的任一字符弧烤,相當(dāng)于或的意思
[^]  匹配除中括號以內(nèi)的內(nèi)容
\ 轉(zhuǎn)義符
| 或者,選擇兩者中的一個蹬敲。注意|將左右兩邊分為兩部分暇昂,而不管左右兩邊有多長多亂
() 從兩個直接量中選擇一個,分組
   eg:gr(a|e)y匹配gray和grey
[\u4e00-\u9fa5]  匹配漢字

案例

驗(yàn)證手機(jī)號:

^\d{11}$

驗(yàn)證郵編:

^\d{6}$

驗(yàn)證日期 2012-5-01

^\d{4}-\d{1,2}-\d{1,2}$

驗(yàn)證郵箱 xxx@itcast.cn

^\w+@\w+\.\w+$

驗(yàn)證IP地址 192.168.1.10

^\d{1,3}\(.\d{1,3}){3}$

JavaScript 中使用正則表達(dá)式

創(chuàng)建正則對象

方式1:

var reg = new RegExp('\d', 'i');
var reg = new RegExp('\d', 'gi');

方式2:

var reg = /\d/i;
var reg = /\d/gi;

參數(shù)

標(biāo)志 說明
i 忽略大小寫
g 全局匹配
gi 全局匹配+忽略大小寫

正則匹配

// 匹配日期
var dateStr = '2015-10-10';
var reg = /^\d{4}-\d{1,2}-\d{1,2}$/
console.log(reg.test(dateStr));

正則提取

// 1. 提取工資
var str = "張三:1000伴嗡,李四:5000急波,王五:8000。";
var array = str.match(/\d+/g);
console.log(array);

// 2. 提取email地址
var str = "123123@xx.com,fangfang@valuedopinions.cn 286669312@qq.com 2瘪校、emailenglish@emailenglish.englishtown.com 286669312@qq.com...";
var array = str.match(/\w+@\w+\.\w+(\.\w+)?/g);
console.log(array);

// 3. 分組提取  
// 3. 提取日期中的年部分  2015-5-10
var dateStr = '2016-1-5';
// 正則表達(dá)式中的()作為分組來使用澄暮,獲取分組匹配到的結(jié)果用Regex.$1 $2 $3....來獲取
var reg = /(\d{4})-\d{1,2}-\d{1,2}/;
if (reg.test(dateStr)) {
  console.log(RegExp.$1);
}

// 4. 提取郵件中的每一部分
var reg = /(\w+)@(\w+)\.(\w+)(\.\w+)?/;
var str = "123123@xx.com";
if (reg.test(str)) {
  console.log(RegExp.$1);
  console.log(RegExp.$2);
  console.log(RegExp.$3);
}

正則替換

// 1. 替換所有空白
var str = "   123AD  asadf   asadfasf  adf ";
str = str.replace(/\s/g,"xx");
console.log(str);

// 2. 替換所有,|,
var str = "abc,efg,123阱扬,abc,123泣懊,a";
str = str.replace(/,|,/g, ".");
console.log(str);

案例:表單驗(yàn)證

QQ號:<input type="text" id="txtQQ"><span></span><br>
郵箱:<input type="text" id="txtEMail"><span></span><br>
手機(jī):<input type="text" id="txtPhone"><span></span><br>
生日:<input type="text" id="txtBirthday"><span></span><br>
姓名:<input type="text" id="txtName"><span></span><br>
//獲取文本框
var txtQQ = document.getElementById("txtQQ");
var txtEMail = document.getElementById("txtEMail");
var txtPhone = document.getElementById("txtPhone");
var txtBirthday = document.getElementById("txtBirthday");
var txtName = document.getElementById("txtName");

//
txtQQ.onblur = function () {
  //獲取當(dāng)前文本框?qū)?yīng)的span
  var span = this.nextElementSibling;
  var reg = /^\d{5,12}$/;
  //判斷驗(yàn)證是否成功
  if(!reg.test(this.value) ){
    //驗(yàn)證不成功
    span.innerText = "請輸入正確的QQ號";
    span.style.color = "red";
  }else{
    //驗(yàn)證成功
    span.innerText = "";
    span.style.color = "";
  }
};

//txtEMail
txtEMail.onblur = function () {
  //獲取當(dāng)前文本框?qū)?yīng)的span
  var span = this.nextElementSibling;
  var reg = /^\w+@\w+\.\w+(\.\w+)?$/;
  //判斷驗(yàn)證是否成功
  if(!reg.test(this.value) ){
    //驗(yàn)證不成功
    span.innerText = "請輸入正確的EMail地址";
    span.style.color = "red";
  }else{
    //驗(yàn)證成功
    span.innerText = "";
    span.style.color = "";
  }
};

表單驗(yàn)證部分价认,封裝成函數(shù):

var regBirthday = /^\d{4}-\d{1,2}-\d{1,2}$/;
addCheck(txtBirthday, regBirthday, "請輸入正確的出生日期");
//給文本框添加驗(yàn)證
function addCheck(element, reg, tip) {
  element.onblur = function () {
    //獲取當(dāng)前文本框?qū)?yīng)的span
    var span = this.nextElementSibling;
    //判斷驗(yàn)證是否成功
    if(!reg.test(this.value) ){
      //驗(yàn)證不成功
      span.innerText = tip;
      span.style.color = "red";
    }else{
      //驗(yàn)證成功
      span.innerText = "";
      span.style.color = "";
    }
  };
}

通過給元素增加自定義驗(yàn)證屬性對表單進(jìn)行驗(yàn)證:

<form id="frm">
  QQ號:<input type="text" name="txtQQ" data-rule="qq"><span></span><br>
  郵箱:<input type="text" name="txtEMail" data-rule="email"><span></span><br>
  手機(jī):<input type="text" name="txtPhone" data-rule="phone"><span></span><br>
  生日:<input type="text" name="txtBirthday" data-rule="date"><span></span><br>
  姓名:<input type="text" name="txtName" data-rule="cn"><span></span><br>
</form>
// 所有的驗(yàn)證規(guī)則
var rules = [
  {
    name: 'qq',
    reg: /^\d{5,12}$/,
    tip: "請輸入正確的QQ"
  },
  {
    name: 'email',
    reg: /^\w+@\w+\.\w+(\.\w+)?$/,
    tip: "請輸入正確的郵箱地址"
  },
  {
    name: 'phone',
    reg: /^\d{11}$/,
    tip: "請輸入正確的手機(jī)號碼"
  },
  {
    name: 'date',
    reg: /^\d{4}-\d{1,2}-\d{1,2}$/,
    tip: "請輸入正確的出生日期"
  },
  {
    name: 'cn',
    reg: /^[\u4e00-\u9fa5]{2,4}$/,
    tip: "請輸入正確的姓名"
  }];

addCheck('frm');


//給文本框添加驗(yàn)證
function addCheck(formId) {
  var i = 0,
      len = 0,
      frm =document.getElementById(formId);
  len = frm.children.length;
  for (; i < len; i++) {
    var element = frm.children[i];
    // 表單元素中有name屬性的元素添加驗(yàn)證
    if (element.name) {
      element.onblur = function () {
        // 使用dataset獲取data-自定義屬性的值
        var ruleName = this.dataset.rule;
        var rule =getRuleByRuleName(rules, ruleName);

        var span = this.nextElementSibling;
        //判斷驗(yàn)證是否成功
        if(!rule.reg.test(this.value) ){
          //驗(yàn)證不成功
          span.innerText = rule.tip;
          span.style.color = "red";
        }else{
          //驗(yàn)證成功
          span.innerText = "";
          span.style.color = "";
        }
      }
    }
  }
}

// 根據(jù)規(guī)則的名稱獲取規(guī)則對象
function getRuleByRuleName(rules, ruleName) {
  var i = 0,
      len = rules.length;
  var rule = null;
  for (; i < len; i++) {
    if (rules[i].name == ruleName) {
      rule = rules[i];
      break;
    }
  }
  return rule;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嗅定,一起剝皮案震驚了整個濱河市自娩,隨后出現(xiàn)的幾起案子用踩,更是在濱河造成了極大的恐慌,老刑警劉巖忙迁,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脐彩,死亡現(xiàn)場離奇詭異,居然都是意外死亡姊扔,警方通過查閱死者的電腦和手機(jī)惠奸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恰梢,“玉大人佛南,你說我怎么就攤上這事∏堆裕” “怎么了嗅回?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長摧茴。 經(jīng)常有香客問我绵载,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任娃豹,我火速辦了婚禮焚虱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘懂版。我一直安慰自己鹃栽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布定续。 她就那樣靜靜地躺著谍咆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上滥搭,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天奶躯,我揣著相機(jī)與錄音,去河邊找鬼供嚎。 笑死,一個胖子當(dāng)著我的面吹牛峭状,可吹牛的內(nèi)容都是我干的克滴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼优床,長吁一口氣:“原來是場噩夢啊……” “哼劝赔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起胆敞,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤着帽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后移层,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仍翰,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年观话,在試婚紗的時候發(fā)現(xiàn)自己被綠了予借。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡频蛔,死狀恐怖灵迫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情晦溪,我是刑警寧澤瀑粥,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站尼变,受9級特大地震影響利凑,放射性物質(zhì)發(fā)生泄漏浆劲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一哀澈、第九天 我趴在偏房一處隱蔽的房頂上張望牌借。 院中可真熱鬧,春花似錦割按、人聲如沸膨报。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽现柠。三九已至,卻和暖如春弛矛,著一層夾襖步出監(jiān)牢的瞬間够吩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工丈氓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留周循,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓万俗,卻偏偏與公主長得像湾笛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子闰歪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

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