正則表達式好難學!9個易懂的例子摄欲,輕松入門JavaScript正則

正則表達式是用來描述字符模式的對象挣输。它被用來在文本中執(zhí)行模式匹配(pattern-matching)以及”查找-替換”(search-and-replace)的任務齐饮。

前端開發(fā)中捐寥,我們常常會在這些地方看到正則:

  • 驗證手機號,郵件祖驱,身份證號等是否合法握恳。
  • 刪除字符串前后多余的空格。
  • 從瀏覽器的UserAgent信息中提取出當前是什么瀏覽器捺僻,以及瀏覽器的版本乡洼。來做一些兼容性處理。

正則表達式給人的感覺:很難讀懂匕坯,也難寫束昵。誰知道下面2個正則是干嘛的嗎??

  • /<\/?[a-zA-Z]+(\s+[a-zA-Z]+=".*")*>/g
  • /^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$/ /^[a-zA-Z][a-zA-Z0-9_]{2,6}$/

為什么要學習正則?

正則表達式用簡短的代碼葛峻,能實現(xiàn)非常復雜的文本查找替換操作锹雏。用字符串的api來實現(xiàn)同樣的功能,代碼會復雜的多术奖,代碼量也會多的多礁遵。比如,驗證手機號是否合法采记。我們假定佣耐,合法的手機號指:以1開頭的11位數(shù)字。

用字符串的api挺庞,這么寫:

function validPhone(phone) {
  let isValid = false
  phone += ''
  if (phone.length === 11 && phone[0] === '1' && !isNaN(phone)) {
    isValid = true
  }
  return isValid
}

用正則晰赞,一行代碼搞定:

/^1\d{10}$/.test(phone)

可見稼病,熟練掌握正則表達式选侨,能極大的提升開發(fā)文本的查找替換功能的開發(fā)效率掖鱼。

例子

學習正則表達式的最好方法是從例子開始,理解例子之后再自己對例子進行修改援制。下面戏挡,我們就開始吧~

例子1: 精確匹配

查找文本中是否包含cat。代碼實現(xiàn)如下:

/cat/.test('I have a cat.') // 返回true
/cat/.test('I have a dog.') // 返回 false

上面的代碼中晨仑,/cat/ 創(chuàng)建了一個匹配 cat 的正則褐墅。有兩種方式創(chuàng)建正則對象:

  1. /匹配模式/。 如 /cat/洪己。
  2. new RegExp(匹配模式字符串)妥凳。 如 new RegExp('cat')

這兩種方式的不同點在于答捕,方式2支持傳入變量逝钥。

test 是正則對象上的方法,用來檢索字符串中是否包含指定的值拱镐。返回 true 或 false艘款。還有一個常見的正則方法 exec,用來檢索字符串中指定的值沃琅。

字符串的split哗咆,searchreplace益眉,match方法支持傳入正則晌柬。

例子2: 匹配一類字符:數(shù)字,字母呜叫,空格等

查找文本是否有數(shù)字空繁。代碼實現(xiàn)如下

/\d/.test('3C') // true

常見字符類型的匹配方式如下:

  • .: 匹配一個任意字符。
  • \d: 匹配一個數(shù)字朱庆。
  • \D: 匹配一個非數(shù)字字符盛泡。
  • [a-z]: 匹配一個小寫字母。
  • [A-Z]: 匹配一個大寫字母娱颊。
  • [\u4e00-\u9fa5]: 匹配一個中文字傲诵。
  • \w: 匹配字母、數(shù)字箱硕、下劃線拴竹。等價于[A-Za-z0-9_]。
  • \s: 匹配任何空白字符剧罩,包括空格栓拜、制表符、換頁符等等。
  • \S: 匹配任何非空白字符幕与。
  • \\: 匹配\挑势。

例子3: 匹配指定范圍內(nèi)字符

查找文本中是否包含 ab12 中任意一個字符。代碼實現(xiàn)如下:

/[ab12]/.test('a') // true
/[ab12]/.test('b') // true
/[ab12]/.test('1') // true
/[ab12]/.test('2') // true

[指定范圍] 來匹配指定范圍內(nèi)字符啦鸣。 用 [^指定范圍] 來匹配不在指定范圍內(nèi)的字符潮饱。如:/[^a-z]/ 匹配非小寫字母。

例子4: 匹配重復

查找文本中是否包含5個a诫给。蠻干版香拉,代碼實現(xiàn)如下:

/aaaaa/.test('aaaaa') // true

優(yōu)雅版:

/a{5}/.test('aaaaa') // true

查找文本中是否包含3個ab。代碼實現(xiàn)如下:

/(ab){3}/.test('ababab') // true

注意中狂,上面的代碼中凫碌,用括號包起來ab,把ab變成一個整體胃榕。不加括號证鸥,匹配的是abbb。

重復字符的匹配方式如下:

  • *: 匹配前面的子表達式零次或多次勤晚。
  • +: 匹配前面的子表達式一次或多次枉层。
  • ?: 匹配前面的子表達式零次或一次。
  • {n}: 匹配前面的子表達式確定的 n 次赐写。
  • {n,}: 匹配前面的子表達式至少 n 次鸟蜡。
  • {n,m}: 匹配前面的子表達式 n 到 m之間。

更多例子:

/a\*/ // 匹配任意個a
/https?/ // 匹配 http 和 https
/1\d{10}/ // 11位手機號

例子5: 匹配文本以...開始和以...結尾

查找文本是否以字母開頭挺邀,以數(shù)字結尾揉忘。代碼實現(xiàn)如下:

/^[a-zA-Z].*\d$/.test('ab1') // true

^用來匹配輸入字符串的開始位置。$用來匹配輸入字符串的結束位置端铛。

例子6: 匹配多種情況

查找文本是包含138或包含159泣矛。代碼實現(xiàn)如下:

/(138|159)/.test('138') // true
/(138|159)/.test('159') // true

|用來匹配多種情況。注意禾蚕,情況包含的字符數(shù)量超過一個您朽,要用括號包起來。反例:

/138|159/.test('138') // false
/138|159/.test('13859') // true
/138|159/.test('13159') // true

例子7: 匹配模式

查找文本中是否全部是字母换淆。實現(xiàn)方法1:

/^[a-zA-Z]*$/.test('abcABC') // true

方法2:

/^[a-z]*$/i.test('abcABC') // true

方法2中的i是匹配模式哗总。常見的匹配模式如下:

  • g : 執(zhí)行全局匹配(查找所有匹配而非在找到第一個匹配后停止)
  • i : 執(zhí)行對大小寫不敏感的匹配。
  • m : 執(zhí)行多行匹配倍试。

一個正則可以有多個模式讯屈,表示對多個模式的疊加。如 /a/ig县习。

例子8: 匹配的爭奪:貪婪模式和非貪婪模式

匹配文本中的非空白字符和數(shù)字涮母,要盡量多匹配數(shù)字谆趾。代碼實現(xiàn)如下:

/(\S+?)(\d*)/.exec('a123') // ["a123", "a", "123"]
// 這種寫法,會盡可能多的匹配非空白字符:/(\S+)(\d*)/.exec('a123') // ["a123", "a123", ""]

當正則表達式中包重復的限定符(*+,?, {n}, {n,}, {n,m})時叛本,匹配模式是貪婪的:匹配盡可能多的字符棺妓。在重復的限定符后加?,會將匹配模式改成非貪婪的:匹配盡可能少的字符炮赦。

例子9: 文本替換

將文本中單詞"cat"替換成"dog"。代碼實現(xiàn)如下:

'I have a cat.'.replace(/cat/, 'dog') // 運行結果 I have a dog.

將文本中所有的單詞"cat"替換成"dog"样勃。代碼實現(xiàn)如下:

'cat,cat,cat'.replace(/cat/g, 'dog') // 運行結果 dog,dog,dog

將第2個出現(xiàn)的"cat"替換成"dog"吠勘。代碼實現(xiàn)如下:

let appearNum = 0
let res = 'cat,cat,cat'.replace(/cat/g, (matched) => {
  appearNum++
  if(appearNum === 2) {
    return 'dog'
  } else {
    return matched
  }
})
console.log(res) // 運行結果 cat,dog,cat

推薦工具

RegExr

正則測試工具。

Regulex

JavaScript 正則可視化工具峡眶。展示效果:


Regulex運行結果

總結

熟練掌握正則表達式剧防,能極大的提升開發(fā)文本的查找替換功能的開發(fā)效率。大家有必要去認真學一下辫樱。

本文介紹了正則的基礎峭拘。正則博大精深,還有很多值得研究狮暑。

參考&推薦閱讀

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市搬男,隨后出現(xiàn)的幾起案子拣展,更是在濱河造成了極大的恐慌,老刑警劉巖缔逛,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件备埃,死亡現(xiàn)場離奇詭異,居然都是意外死亡褐奴,警方通過查閱死者的電腦和手機按脚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來敦冬,“玉大人辅搬,你說我怎么就攤上這事〔焙担” “怎么了伞辛?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長夯缺。 經(jīng)常有香客問我蚤氏,道長,這世上最難降的妖魔是什么踊兜? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任竿滨,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘于游。我一直安慰自己毁葱,他們只是感情好,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布贰剥。 她就那樣靜靜地躺著倾剿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蚌成。 梳的紋絲不亂的頭發(fā)上前痘,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機與錄音担忧,去河邊找鬼芹缔。 笑死,一個胖子當著我的面吹牛瓶盛,可吹牛的內(nèi)容都是我干的最欠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼惩猫,長吁一口氣:“原來是場噩夢啊……” “哼芝硬!你這毒婦竟也來了?” 一聲冷哼從身側響起轧房,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤吵取,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后锯厢,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體皮官,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年实辑,在試婚紗的時候發(fā)現(xiàn)自己被綠了捺氢。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡剪撬,死狀恐怖摄乒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情残黑,我是刑警寧澤馍佑,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站梨水,受9級特大地震影響拭荤,放射性物質發(fā)生泄漏。R本人自食惡果不足惜疫诽,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一舅世、第九天 我趴在偏房一處隱蔽的房頂上張望旦委。 院中可真熱鬧,春花似錦雏亚、人聲如沸缨硝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽查辩。三九已至,卻和暖如春网持,著一層夾襖步出監(jiān)牢的瞬間宜岛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工翎碑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人之斯。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓日杈,卻偏偏與公主長得像,于是被迫代替她去往敵國和親佑刷。 傳聞我的和親對象是個殘疾皇子莉擒,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

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

  • `>本文是 Jan Goyvaerts 為 RegexBuddy 寫的教程的譯文,版權歸原作者所有 在本文中講述了...
    極客圈閱讀 2,079評論 0 5
  • 本文譯自 制作正則引擎的作者 Jan Goyvaerts 為工具 RegexBuddy 寫的教程版權歸原作者所有注...
    極客圈閱讀 3,290評論 0 25
  • 正則表達式到底是什么東西瘫絮?字符是計算機軟件處理文字時最基本的單位涨冀,可能是字母,數(shù)字麦萤,標點符號鹿鳖,空格,換行符壮莹,漢字等...
    獅子挽歌閱讀 2,148評論 0 9
  • 注:本篇文章只為方便查看翅帜,特此保留,如有冒犯命满,敬請諒解@缘巍!胶台! 本文目標 30分鐘內(nèi)讓你明白正則表達式是什么歼疮,并對它...
    阿杰Alex閱讀 1,483評論 0 10
  • 學了NLP之后的我,最大的變化是:遇到很多事情擠在一起到來的時候诈唬,我發(fā)現(xiàn)自己特別有天賦韩脏,很強的規(guī)劃能力和分配能力!...
    A憶思特教育趙敏閱讀 116評論 0 2