正則表達(dá)式

正則表達(dá)式

概念

  • 正則表達(dá)式是對(duì)字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符恒序、及這些特定字符的組合瘦麸,組成一個(gè)“規(guī)則字符串”,這個(gè)“規(guī)則字符串”用來表達(dá)對(duì)字符串的一種過濾邏輯

目的

  • 給定的字符串是否符合正則表達(dá)式的過濾邏輯(稱作“匹配”):
  • 可以通過正則表達(dá)式歧胁,從字符串中獲取我們想要的特定部分滋饲。

正則表達(dá)式在前端的應(yīng)用場(chǎng)景

  • 表單驗(yàn)證
  • 驗(yàn)證手機(jī)號(hào)
  • 驗(yàn)證郵箱
  • 驗(yàn)證車牌號(hào)
  • 其中的一些符號(hào) 可實(shí)現(xiàn)對(duì)字符串的高效操作

js中正則的創(chuàng)建

  • 字面量形式
  var expression = /pattern/flags
  // eg.
  var p = /acc/g

  • 構(gòu)造函數(shù)法
var p1 = new RegExp('alex', 'g')

正則驗(yàn)證網(wǎng)站

元字符

  • 匹配所有字符
/./ 
  • 匹配數(shù)字 字母和下劃線
\w 匹配數(shù)字 字母 下劃線 等價(jià) [A-Za-z0-9_]
\W 取非
  • 匹配數(shù)字
\d 匹配數(shù)字
\D 取非
  • 匹配空白字符
\s 匹配空白字符
\S 取非
  • [] 匹配區(qū)間的任意字符
1. [a-zA-Z0-9]     // 匹配大小寫字母和數(shù)字
2. [\u4e00-\u9fa5] // 匹配所有中文 
3. [^a-zA-Z0-9]    // ^用在[ ] 中就是取非的意思
  • 重復(fù)匹配 + (匹配一次或者多次)
\mj+\g

mj
mjjj


\[mM][jJ]+\g
mj
mjj
MJ
MJJ
MjJJJ
  • +匹配1次或多次@
  • *匹配0次或者多次
  • ?匹配0次或者1次(可有可無)
  • () 分組匹配
  • ?: 不捕獲(在分組中使用)

分組匹配

/(http|https):\/{2}w{3}.[a-z]+.(com|cn)/g

https://www.baidu.com
http://www.google.com
http://www.mi.cn
https://www.ape.com

分組后 用tools 可以獲取
RegExp.$1
https
http
http
https

RegExp.$2
com
com
cn
com 

// 不捕獲 (?:http|https) 
RegExp.$1
com
com
cn
com 
```js
const RE_DATE = /(\d{4})-(\d{2})-(\d{2})/;

const matchObj = RE_DATE.exec('1999-12-31');
const year = matchObj[1]; // 1999
const month = matchObj[2]; // 12
const day = matchObj[3]; // 31

// 具名組匹配

const RE_DATE = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;

const matchObj = RE_DATE.exec('1999-12-31');
const year = matchObj.groups.year; // 1999
const month = matchObj.groups.month; // 12
const day = matchObj.groups.day; // 31

正向預(yù)查(數(shù)字后要跟著'元' 但是'元'不包括)

/\d+(?=元)/g

200元   // 匹配200
2000元  // 匹配2000
200刀   // 不匹配
2000磅  // 不匹配

// 否定(數(shù)字后不能跟'元', 且這個(gè)'元'不包括)
/\d+(?!元)/g

200元   // 匹配20
2000元  // 匹配200
200刀   // 匹配200
2000磅  // 匹配2000

反向預(yù)查 ('元'開頭 但是'元'不包括)

/(?<=元)\d/g

元200   // 匹配200
元2000  // 匹配2000
刀200   // 不匹配
磅2000  // 不匹配

// 否定 = 換成 !

重復(fù)類

/\d{4, 8}/g
// 最多8 最少4

/\d{4}/g
// 匹配4個(gè)

正則實(shí)例對(duì)象的一些方法

  • .test() 返回一個(gè) boolean
var p = /acc/g

var str = 'acc'

p.test(str) // true, false

'''

- .exec() 返回匹配的結(jié)果 返回一個(gè)數(shù)組 沒有的話 返回 null
```js
RegExpObject.exec(string)

字符串的方法

  • match()
    對(duì)字符串進(jìn)行正則匹配 返回匹配的結(jié)果
var str = 'hello world'
undefined
str.match(/l/)
=>> ["l", index: 2, input: "hello world", groups: undefined]
str.match(/l/g)
=>>["l", "l", "l"]
str.match(/a/g)
=>>null
  • search()
    返回第一個(gè)滿足條件的匹配結(jié)果在整個(gè)字符串中的位置 , 如果沒有任何匹配, 返回 -1
var str = 'hello world'
undefined
str.search(/l/)
=>> 2
str.search(/llo/)
=>> 2
str.match(/l/g)
=>>2
str.match(/a/)
=>>-1
  • replace(regexp/substr,replacement)
    可以替換匹配的值, 它接受兩個(gè)參數(shù),
    • 第一參數(shù)是正則表達(dá)式或字符串(表示搜索模式),
    • 第二個(gè)是匹配的內(nèi)容 一個(gè)字符串值。替換文本的函數(shù)(要有return)
      • 在這種情況下喊巍,每個(gè)匹配都調(diào)用該函數(shù)屠缭,它返回的字符串將作為替換文本使用。該函數(shù)的第一個(gè)參數(shù)是匹配模式的字符串崭参。接下來的參數(shù)是與模式中的子表達(dá)式匹配的字符串呵曹,可以有 0 個(gè)或多個(gè)這樣的參數(shù)。接下來的參數(shù)是一個(gè)整數(shù),聲明了匹配在 stringObject 中出現(xiàn)的位置奄喂。最后一個(gè)參數(shù)是 stringObject 本身铐殃。
'2019.10.05'.replace(/\./g, '-')
=>> '2019-10-05'

let data = {
    name: '小明',
    message: '消息'
}
let str = "<p>{{name}}-{{message}}</p>"
let exp = /\{\{(.+?)(\})\}/g
let result = str.replace(exp, (a, $1, $2, index, strObj) => {
    // 根據(jù) str 的特征 此回調(diào)調(diào)用兩次 注意 $1, $2 .... 和 正則的分組要一致
    console.log(a)  // {{name}} {{message}}
    console.log($1) // name message
    console.log($2) // } }
    console.log(index) // 3 12
    console.log(strObj) // "<p>{{name}}-{{message}}</p>" "<p>{{name}}-{{message}}</p>"
    return data[$1] // 返回值就是要替換的
})
console.log(str)    // <p>{{name}}-{{message}}</p>
console.log(result) // <p>小明-消息</p>

實(shí)際應(yīng)用

檢查用戶賬號(hào)

  • 規(guī)則:
    1. 由數(shù)字,字母,下劃線組成
    2. 字母開頭
    3. 長(zhǎng)度 4-16位
/^[a-zA-Z]\w{3,15}$/

匹配手機(jī)號(hào)

  • 規(guī)則
    1. 1開頭
    2. 第二位是 34578
    3. 其他9位是 0-9 并結(jié)尾
/^1[3|4|5|7|8][0-9]{9}$/

驗(yàn)證電話號(hào)

  • 規(guī)則:
    1. 0開頭
    2. 拼接 2或3位數(shù)字
    3. 拼接 - 可有可無
    4. 拼接 7或8位數(shù)字
    5. 01088888888 010-7777777 0375-7777777 03757777777
/^0\d{2,3}-?\d{7,8}$/g

匹配身份證號(hào)

  • 規(guī)則:
    1. 15或者18位
    2. 15位全是數(shù)字
    3. 18位 前17是數(shù)字 最后一位 [0-9|x|X]
/(^\d{15}$)|(^\d{18}$)|(^[0-9]{17}[\d|x|X])/

匹配郵箱

  • 規(guī)則
    1. 第一部分@ 第二部分.com|cn|net
/[a-zA-Z0-9_.-]+@[a-zA-Z0-9_.-]+\.(com|cn|net)$/
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市跨新,隨后出現(xiàn)的幾起案子富腊,更是在濱河造成了極大的恐慌,老刑警劉巖玻蝌,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蟹肘,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡俯树,警方通過查閱死者的電腦和手機(jī)帘腹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來许饿,“玉大人阳欲,你說我怎么就攤上這事÷剩” “怎么了球化?”我有些...
    開封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)瓦糟。 經(jīng)常有香客問我筒愚,道長(zhǎng),這世上最難降的妖魔是什么菩浙? 我笑而不...
    開封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任巢掺,我火速辦了婚禮,結(jié)果婚禮上劲蜻,老公的妹妹穿的比我還像新娘陆淀。我一直安慰自己,他們只是感情好先嬉,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開白布轧苫。 她就那樣靜靜地躺著,像睡著了一般疫蔓。 火紅的嫁衣襯著肌膚如雪含懊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天衅胀,我揣著相機(jī)與錄音岔乔,去河邊找鬼。 笑死拗小,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的樱哼。 我是一名探鬼主播哀九,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼剿配,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了阅束?” 一聲冷哼從身側(cè)響起呼胚,我...
    開封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎息裸,沒想到半個(gè)月后蝇更,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡呼盆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年年扩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片访圃。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡厨幻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出腿时,到底是詐尸還是另有隱情况脆,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布批糟,位于F島的核電站格了,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏徽鼎。R本人自食惡果不足惜盛末,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望纬傲。 院中可真熱鬧满败,春花似錦、人聲如沸叹括。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽汁雷。三九已至净嘀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間侠讯,已是汗流浹背挖藏。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留厢漩,地道東北人膜眠。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親宵膨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子架谎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

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