正則語法
正則表達(dá)式的創(chuàng)建方式
使用正則表達(dá)式字面量启摄,用兩個
/
來表示 ,/正則表達(dá)式/
var reg = /abc/
使用RegExp對象的構(gòu)造函數(shù)瓣铣,new RegExp("正則表達(dá)式"哥遮,“imgs”)
第一個參數(shù) 是 正則表達(dá)式 笨使, 第二個參數(shù) 是 后綴修飾符
var reg= new RegExp("abc")
正則表達(dá)式的組成
由一些普通字符和一些特殊字符(又叫元字符--metacharacters)組成。普通字符包括大小寫的字母和數(shù)字竞阐,而元字符則具有特殊的含義提茁。
特殊字符:javascript 中常用特殊字符有 ( ) [ ] { } \ ^ $ | ? * .+
如果正則表達(dá)式中包含以上的特殊字符, 則需要使用 轉(zhuǎn)義符 \
對其進(jìn)行轉(zhuǎn)義馁菜,如: \(
茴扁,\^
,\\
預(yù)定義特殊字符:
\t
制表符
\n
回車符
\f
換頁符
\b
空格
正則表達(dá)式字符集
- 最簡單的正則
關(guān)鍵字原文
/abc/
-----> 匹配的是 "abc"
備選字符集 ---[]
某一個可用的備選字符列表汪疮,使用[備選的字符列表]
var str = "out ont o1t ";
console.log(str.match(/o[usb]t/g)); // ["out"]
- 連續(xù)備選字符
若備選的字符列表太多峭火,且類型相同,全部輸入太麻煩智嚷,可以在 中間加了個橫線-
卖丸,將字符連起來,如[a-z]盏道、[0-9]稍浆、[A-Z]、[0-9a-z]
var str = "out ont o1t ";
console.log(str.match(/o[0-9a-z]t/g)); // ["out", "ont", "o1t"]
- 反向: [] 前面加個元字符進(jìn)行取反,表示匹配不能為括號里面的字符衅枫。[^0-9] --->除去0-9的關(guān)鍵字符
var str = "out ont o1t ";
console.log(str.match(/o[^0-9]t/g)); // ["out", "ont"]
一個中括號嫁艇,只能匹配到一個字符
預(yù)定義備選字符集
\d
---------> [0-9]
\w
---------> [0-9a-zA-Z]
\s
---------> [ \t\n\x0B\f\r] 匹配所有的空字符,如:空格弦撩、制表符步咪、換行
.
---------> [^\n\r] 除了換行和回車 后的任意字符
\D ---------> [^0-9] 非數(shù)字字符
\W ---------> [^a-zA-Z_0-9] 非單詞字符
\S ---------> [^ \t\n\x0B\f\r] 非空白字符
[\u4e00-\u9fa5] -----> 中文字符集
量詞 ---{}
規(guī)定相鄰的前一個字符集出現(xiàn)的次數(shù)
寫法 | 含義 |
---|---|
{n} | 必須n次 |
{n,m} | 至少出現(xiàn) n 次但不超過 m 次(中間不能有空格) |
{n,} | 至少出現(xiàn)n次(+的升級版) |
? | 出現(xiàn)零次或一次(最多一次) |
* | 出現(xiàn)零次或多次(任意次) |
+ | 出現(xiàn)一次或多次(至少一次) |
分組 ---()
分組,在正則表達(dá)式中用()包裹起來的內(nèi)容代表一個分組
- 分組的反向引用
- 正則表達(dá)式中的每個()益楼,都是一個子表達(dá)式猾漫,每個子表達(dá)式都會自動獲得一個從 1 開始的編號
- 在正則表達(dá)式內(nèi)部,可用
\
編號 形式 來表示 分組中的第i個子表達(dá)式匹配到的內(nèi)容感凤,如/(a)\1/
--> 表示匹配 字符為aa 的內(nèi)容- 而在正則表達(dá)式外悯周,可用
n陪竿,常用于replace()方法中
$的表示方式
- $i:(i取值范圍1~99)队橙,表示從左到右正則子表達(dá)式所匹配的內(nèi)容
- $&:表示與正則表達(dá)式匹配的全部內(nèi)容
- $`: ($ + `,反引號):表示匹配字符串的左邊內(nèi)容
- $':($ + ' 單引號)萨惑,表示匹配字符串的右邊內(nèi)容
var date = "20201225一下065959";
var reg = /(\d{4})(\d{2})(\d{2})([\u4e00-\u9fa5])([\u4e00-\u9fa5])(\d{2})(\d{2})(\d{2})/;
// 2020 12 25 一 下 06 59 59
// $1 $2 $3 $4 $5 $6 $7 $8
date = date.replace(reg, "$1年$2月$3日 星期$4 $5午 $6:$7:$8")捐康;
console.log(date)
var dateStr = '2020-12-25';
var reg = /(\d{4})-(\d{2})-(\d{2})/;
console.log(reg.test(dateStr)); //true
console.log(RegExp.$1) //2020
console.log(RegExp.$2) //12
console.log(RegExp.$3) //25
選擇 ---|
字符 |
用于分隔供選擇的字符,可理解為 “或”庸蔼,表示在多個選擇項中選擇一個解总,在正則的優(yōu)先級中非常低
- 匹配選擇的規(guī)則
選擇項是從左到右考慮,直到發(fā)現(xiàn)了匹配項姐仅。如果左邊的選擇項匹配花枫,則忽略右邊的匹配項,即使它產(chǎn)生更好的匹配掏膏。
邊界 --- ^
或 $
^
匹配開始位置 (注意與[^]區(qū)分開)
表示限制開頭劳翰,后面的正則內(nèi)容匹配的結(jié)果必須出現(xiàn)在字符串開始$
匹配結(jié)束位置
表示限制結(jié)尾,前面的正則內(nèi)容匹配的結(jié)果必須出現(xiàn)在字符串結(jié)尾前加
^
后加$
馒疹,且中間沒有|
, 表示同時限制開頭和結(jié)尾佳簸,中間的字符必須與正則表達(dá)式完全匹配\b
: 表示單詞的邊界 如:\bno\b
只匹配單詞no,如果匹配獨立的單詞颖变,則兩邊同時加\b
正則表達(dá)式 后綴修飾符
g
--->(global) 修飾符用于執(zhí)行全局匹配(查找所有匹配而非在找到第一個匹配后停止)
i
--->(ignore case)修飾符用于執(zhí)行對大小寫不敏感的匹配
m
--->(multiline)修飾符用于多行模式執(zhí)行的匹配(若正則表達(dá)式?jīng)]有^
或$
匹配字符串的開頭或結(jié)尾生均,那么/m
修飾符沒有任何意義)
s
---> (singleline),dotAll標(biāo)志腥刹,匹配任意字符马胧,包括換行,解決.
匹配的缺點(除了換行和回車 后的任意字符),與m
不同衔峰,m
只影響^
和$
佩脊,而s
只影響.
相關(guān)的正則方法
字符串的方法
split()
根據(jù)匹配字符串切割父字符串
// 通過空格字符串進(jìn)行分割
var str = "aa bbb c dd eeeeee";
console.log(str.split(/\s+/)); // ["aa", "bbb", "c", "dd", "eeeeee"]
search()
對正則表達(dá)式或指定字符串進(jìn)行搜索蛙粘,返回第一個出現(xiàn)的匹配項的下標(biāo)。如果未找到威彰,則返回 -1
// 查詢子串在父字符串中出現(xiàn)的位置
var str = "abcdefg";
console.log(str.search(/cd/)); // 2
console.log(str.search(/cdf/)); // -1
match()
使用正則表達(dá)式與字符串相比較出牧,返回一個包含匹配結(jié)果的數(shù)組
默認(rèn)是只返回第一個找到的關(guān)鍵詞就結(jié)束
在正則表達(dá)式后 加上后綴 g
,能夠匹配到所有關(guān)鍵詞的 數(shù)組
如果未找到抱冷,則返回null
在使用此方法時崔列,需要先判斷匹配的結(jié)果kwords是否為 null梢褐,再對結(jié)果進(jìn)行使用數(shù)組的相關(guān)方法旺遮,如 kwords.length
// 在父字符串中去匹配符合的子字符串
var str = "abbcccbbbbbddbbbdabbb";
console.log(str.match(/b+/)); // ["bb"]
console.log(str.match(/b+/g)); // ["bb", "bbbbb", "bbb", "bbb"]
replace()
用正則表達(dá)式和字符串直接比較,然后用新的子串來替換被匹配的子串
默認(rèn)匹配第一個符合的子串 就結(jié)束
匹配所有符合的關(guān)鍵詞盈咳,需要加 后綴 g
// 替換字符串的指定部分耿眉,返回值是一個新的替換后的字符串
var str = "aa abb acc add";
console.log(str.replace(/a+/,"A")); // "A abb acc add"
console.log(str.replace(/a+/g,"A")); // "A Abb Acc Add"
RegExp對象的方法
exec()
查找匹配的字符串,輸出到數(shù)組中鱼响,既獲得每個關(guān)鍵字的內(nèi)容鸣剪,又獲得每個關(guān)鍵字的位置,但只會在找到第一個之后直接中止丈积。
形如: var arr = reg.exec(str)筐骇;
,表示從str中查找符合reg要求的關(guān)鍵詞的位置和內(nèi)容江滨,并保存在數(shù)組arr中
特點
- 返回的結(jié)果為數(shù)組铛纬,每次只返回一個關(guān)鍵字的內(nèi)容,新的關(guān)鍵字替換上一個唬滑,保存在arr[0]中告唆,如果找不到,則返回null
- 將本次找到的關(guān)鍵字的位置保存在arr.index中
- 自動調(diào)整晶密,reg.lastIndex屬性為下次開始的查找位置(默認(rèn)從0開始)擒悬,因此每個關(guān)鍵字都是arr[0],因為會被替換
因此稻艰,根據(jù)以上exec()存在的特點懂牧,可以通過 循環(huán)遍歷使用該方法來獲取所有符合關(guān)鍵字的內(nèi)容(需要加后綴修飾符
g
)
test()
檢測字符串中是否滿足正則表達(dá)式的匹配規(guī)則,返回值是布爾值
形如:reg.test(str)尊勿;
归苍,如果str符合reg的要求,則返回 true运怖,表示驗證通過拼弃,否則為false,驗證失敗
一般在做驗證中摇展,會配合
^
和$
一起使用吻氧,否則會出現(xiàn) 局部匹配 就驗證通過的情況
深入學(xué)習(xí)正則表達(dá)式,推薦看這本書《JavaScript 正則迷你書》