正規表示式 js 含有 正向預查和負向預查

2021-08-07 19:23:44 字數 3731 閱讀 1169

第一次見到正規表示式的時候,感覺好難啊,要記得東西怎麼那麼多.學了好幾遍,但還是很矇圈,可能是用的少,平時用的時候也就那麼基礎需要使用,再者就是複製貼上正規表示式.

那麼什麼是正規表示式呢?正規表示式就是乙個描述字元規則的物件.那為什麼會有正規表示式呢,這裡引用沫晴姐姐的一句話,就是因為計算機笨唄(沫晴姐姐引用別人的話).比如[email protected],這個一看就知道是郵箱,課時計算機還有乙個個的驗證.

不說了,直接進入主題吧.

為了減輕驗證資料的工作量,用正則就行.

1.第一種方式:

var reg = new

regexp("string","lg");//第二個引數為修飾符

i: 表示忽略大小寫,英文ignore

g:表示全域性匹配,即查詢所有的,英文global

2.第二種方式:

var reg = /string/ig;
test:用來檢索指定值,返回值為true和false

let reg = /s/ig;

console.log(reg.test("study"));///返回true

console.log(reg.test("tudy"));///返回false

exec:用來檢索字串中的是否有匹配值,有的話則返回乙個陣列,沒有匹配到,則返回null.

let reg = /s/ig;

console.log(reg.exec("studystudy"));///[ 's', index: 0, input: 'studystudy' ]

console.log(reg.exec("studystudy"));///[ 's', index: 5, input: 'studystudy' ],繼續上一次的位置繼續

console.log(reg.exec("good"));//null

注意:若沒有指定g修飾符,則每次從開始匹配,否則,conf上次匹配結束為止開始匹配

search: 匹配是否有匹配值,返回字串中的第乙個與正規表示式想匹配的子字串的起始位置,沒有找到返回-1.

let reg = /s/ig;

console.log("studys".search(reg)); ///列印0,有兩個s,只列印了第乙個位置的s

match: 找到乙個或多個正規表示式的匹配值

let reg = /s/ig;

console.log("studys".match(reg)); ///[ 's', 's' ]

replace: 替換與正規表示式匹配的值

let reg = /s/ig;

console.log("studys".replace(reg,"***")); /// 返回***tudy***

split: 把字串分割成陣列

let reg = /s/ig;

console.log("goodstudysboy".split(reg)); ///[ 'good', 'tudy', 'boy' ]

正規表示式由普通字元(例如字母)和特殊字元(例如+)構成,組成的文字模式.

1.字元匹配符

\s : 空格

\s : 非空格

\d : 數字

\d : 非數字

\w : 字元 ( 字母 ,數字,下劃線_ )

\w : 非字元例子:是否有不是數字的字元

let reg = /\d/ig;

console.log("123go567odstudysboy".match(reg)); ///列印[ '1', '2', '3', '5', '6', '7' ]

(其餘的我就不試了)

[xyz]: 匹配x,y,z任意乙個字元, 例如[23w]

[^x,y,z]: 匹配不包含x,y,z的字元, 例如[^12w]

[a-z]: 匹配a-z之間的任意字元, 例如[1-5]

[^a-z]匹配非a-z之間的任意字元, 例如[^1-5]

2.限定符

* : 匹配》=0次

+ : 匹配》=1次

? : 匹配0或1次

: 匹配n次

: 匹配至少n次

: 匹配至少n次,最對m次

注意: 正規表示式很貪婪的,所以他會盡可能的多的去匹配,

凡是限定符後面緊跟? , 則他會減少貪婪的慾望

3.定位符

^ : 匹配字串開始的位置

$ : 匹配字串結束的位置

\b : 匹配單詞的邊界, 就是單詞和空格之間的位置

\b : 匹配非單詞邊界

4.轉義字元

\ : 轉義某也特殊的字元, 例如匹配$符號

5.轉義字元

| : 匹配多個規則

6.特殊用法

() : 捕獲型分組,即子表示式,使用\1,\2,\3…對子組的引用

(?:pattern) : 非捕獲型分組.匹配pattern但不獲取匹配結果。也就是說這是乙個非獲取匹配,不進行儲存供以後使用。這在使用 「或」 字元 (|) 來組合乙個模式的各個部分是很有用。

(?=pattern) : 正向預查,在任何匹配pattern的字串開始處匹配字串.非獲取字串.就是匹配pattern字串,但不返回pattern,返回的是與pattern匹配的字串但要把pattern去掉.

舉個例子,我們 匹配windows後面是7,8,8.1的,只留windows

var str = "windows98 windows7 windows8 windows8.1 windows10 windowsvista windowsxp";

var reg = /windows(?=7|8\.1|8)/g;

var a = str.match(reg);

console.log(a); //返回[ 'windows', 'windows', 'windows' ]

(?!pattern) : 負向預查,匹配與正向預查相反,返回的是不是匹配到pattern的值,也就是正向預查的補集,舉個栗子,匹配後面windows後面不是7,8,8.1的值,只留windows

var str = "windows98 windows7 windows8 windows8.1 windows10 windowsvista windowsxp";

var reg = /windows(?!7|8\.1|8)/g;

var a = str.match(reg);

console.log(a);//

//返回[ 'windows', 'windows', 'windows' ,'windows']

還是不明白的看圖,圖畫的醜,別介意啊,畢竟我不是藝術生.

圖中,大黑框相當於字串,小框表示單詞,然後給每個小框編號,黑陰影部分表示要匹配的部分,當使用正向預查時,匹配的結果是: 1中的空白部分和4中的空白部分. 當使用負向預查時,匹配的結果是: 2中和3中的空白部分

有錯誤的地方,請指出謝謝

正規表示式的正向預查

首先,讓我們先做一道演算法題 將一串帶小數的金額,例如 1010000.5689,每3位加上 分隔符。剛開始我的做法是將.左邊的部分單獨提取出來進行正則替換,這花費了不少的步驟,直到我發現這種做法 function commafy str d g,1,console.log commafy 1010...

正規表示式之正向預查和反向預查

正向預查 1.正向正預查 例如 foo bar 匹配後面帶有bar的foo 它可以匹配 foobar,abcfoobar 中的foo 但是不能匹配 fooabc 中的foo 2.正向負預查 例如 foo bar 匹配後面不帶bar的foo 它可以匹配 foo123 但是不能匹配 foobar 負向預...

案例 使用正規表示式中的正向預查和反向預查

需求如下 從excel 裡複製下來的數千行下列字串如上,需要儲存下 r20171028153620837 的字元,其餘刪除。最快捷的方法就將這一列值複製到notepad 中,使用正規表示式 r d 匹配到這一字元,怎麼樣能得到匹配之外的結果而進行replace替換為空呢,那這樣就大工告成了。然後就用...