則表達式(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE)使用單個字符串來描述、匹配一系列符合某個句法規(guī)則的字符串搜索模式。
搜索模式可用于文本搜索和文本替換。
什么是正則表達式?
正則表達式是由一個字符序列形成的搜索模式。
當你在文本中搜索數(shù)據(jù)時,你可以用搜索模式來描述你要查詢的內(nèi)容。
正則表達式可以是一個簡單的字符,或一個更復雜的模式。
正則表達式可用于所有文本搜索和文本替換的操作。
語法
/正則表達式主體/修飾符(可選)
其中修飾符是可選的。
實例:
var patt = /runoob/i
實例解析:
/runoob/i 是一個正則表達式。
runoob 是一個正則表達式主體 (用于檢索)。
i 是一個修飾符 (搜索不區(qū)分大小寫)。
使用字符串方法
在 JavaScript 中,正則表達式通常用于兩個字符串方法 : search() 和 replace()。
search() 方法 用于檢索字符串中指定的子字符串,或檢索與正則表達式相匹配的子字符串,并返回子串的起始位置。
replace() 方法 用于在字符串中用一些字符替換另一些字符,或替換一個與正則表達式匹配的子串。
search() 方法使用正則表達式
實例
使用正則表達式搜索 "Runoob" 字符串,且不區(qū)分大小寫:
varstr = "Visit Runoob!"; varn = str.search(/Runoob/i);
輸出結(jié)果為:
6
search() 方法使用字符串
search 方法可使用字符串作為參數(shù)。字符串參數(shù)會轉(zhuǎn)換為正則表達式:
實例
檢索字符串中 "Runoob" 的子串:
varstr = "Visit Runoob!"; varn = str.search("Runoob");
replace() 方法使用正則表達式
實例
使用正則表達式且不區(qū)分大小寫將字符串中的 Microsoft 替換為 Runoob :
varstr = document.getElementById("demo").innerHTML; vartxt = str.replace(/microsoft/i,"Runoob");
結(jié)果輸出為:
Visit Runoob!
replace() 方法使用字符串
replace() 方法將接收字符串作為參數(shù):
varstr = document.getElementById("demo").innerHTML; vartxt = str.replace("Microsoft","Runoob");
正則表達式修飾符
修飾符 可以在全局搜索中不區(qū)分大小寫:
正則表達式參數(shù)可用在以上方法中 (替代字符串參數(shù))。
正則表達式使得搜索功能更加強大(如實例中不區(qū)分大小寫)。
修飾符 | 描述 |
---|---|
i | 執(zhí)行對大小寫不敏感的匹配。 |
g | 執(zhí)行全局匹配(查找所有匹配而非在找到第一個匹配后停止)。 |
m | 執(zhí)行多行匹配。 |
正則表達式模式
方括號用于查找某個范圍內(nèi)的字符:
表達式 | 描述 |
---|---|
[abc] | 查找方括號之間的任何字符。 |
[0-9] | 查找任何從 0 至 9 的數(shù)字。 |
(x|y) | 查找任何以 | 分隔的選項。 |
元字符是擁有特殊含義的字符:
元字符 | 描述 |
---|---|
\d | 查找數(shù)字。 |
\s | 查找空白字符。 |
\b | 匹配單詞邊界。 |
\uxxxx | 查找以十六進制數(shù) xxxx 規(guī)定的 Unicode 字符。 |
量詞:
量詞 | 描述 |
---|---|
n+ | 匹配任何包含至少一個 n 的字符串。 |
n* | 匹配任何包含零個或多個 n 的字符串。 |
n? | 匹配任何包含零個或一個 n 的字符串。 |
使用 RegExp 對象
在 JavaScript 中,RegExp 對象是一個預定義了屬性和方法的正則表達式對象。
使用 test()
test() 方法是一個正則表達式方法。
test() 方法用于檢測一個字符串是否匹配某個模式,如果字符串中含有匹配的文本,則返回 true,否則返回 false。
以下實例用于搜索字符串中的字符 "e":
實例
var patt = /e/;
patt.test("The best things in life are free!");
字符串中含有 "e",所以該實例輸出為:
true
你可以不用設(shè)置正則表達式的變量,以上兩行代碼可以合并為一行:
/e/.test("The best things in life are free!")
使用 exec()
e
4小時制時間(HH:mm:ss)
/^((?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d$)/
12小時制時間(hh:mm:ss)
/^(1[0-2]|0?[1-9]):[0-5]\d:[0-5]\d$/
base64格式
/^\s*data:([a-z]+\/[a-z0-9-+.]+(;[a-z-]+=[a-z0-9-]+)?)?(;base64)?,([a-z0-9!$&',()*+;=\-._~:@\/?%\s]*?)\s*$/i
數(shù)字/貨幣金額(支持負數(shù)、千分位分隔符)
/(^[-]?[1-9]\d{0,2}($|(,\d{3})*($|(\.\d{1,2}$))))|((^[0](\.\d{1,2})?)|(^[-][0]\.\d{1,2}))$/
數(shù)字/貨幣金額 (只支持正數(shù)、不支持校驗千分位分隔符)
/(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/
銀行卡號(16或19位)
/^([1-9]{1})(\d{15}|\d{18})$/
中文姓名
/^([\u4e00-\u9fa5·]{2,10})$/
新能源車牌號
/[京津滬渝冀豫云遼黑湘皖魯新蘇浙贛鄂桂甘晉蒙陜吉閩貴粵青藏川寧瓊使領(lǐng) A-Z]{1}[A-HJ-NP-Z]{1}(([0-9]{5}[DF])|([DF][A-HJ-NP-Z0-9][0-9]{4}))$/
非新能源車牌號
/^[京津滬渝冀豫云遼黑湘皖魯新蘇浙贛鄂桂甘晉蒙陜吉閩貴粵青藏川寧瓊使領(lǐng) A-Z]{1}[A-HJ-NP-Z]{1}[A-Z0-9]{4}[A-Z0-9掛學警港澳]{1}$/
車牌號(新能源+非新能源)
/^([京津滬渝冀豫云遼黑湘皖魯新蘇浙贛鄂桂甘晉蒙陜吉閩貴粵青藏川寧瓊使領(lǐng) A-Z]{1}[A-HJ-NP-Z]{1}(([0-9]{5}[DF])|([DF]([A-HJ-NP-Z0-9])[0-9]{4})))|([京津滬渝冀豫云遼黑湘皖魯新蘇浙贛鄂桂甘晉蒙陜吉閩貴粵青藏川寧瓊使領(lǐng) A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9 掛學警港澳]{1})$/
URL鏈接(網(wǎng)址)
/^((https?|ftp|file):\/\/)?([\da-z.-]+)\.([a-z.]{2,6})(\/\w\.-]*)*\/?/
手機號(嚴謹), 根據(jù)工信部2019年最新公布的手機號段
/^1((3[\d])|(4[5,6,7,9])|(5[0-3,5-9])|(6[5-7])|(7[0-8])|(8[\d])|(9[1,8,9]))\d{8}$/
手機號(寬松), 只要是13,14,15,16,17,18,19開頭即可
/^1[3-9]\d{9}$/
手機號(最寬松), 只要是1開頭即可, 如果你的手機號是用來接收短信, 優(yōu)先建議選擇這一條
/^1\d{10}$/
日期, 如: 2000-01-01或2000-1-1
/^\d{4}(-)([0-1][0-2]|\d)\1([0-2]\d|\d|30|31)$/
email地址
/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/
國內(nèi)座機電話,如: 0341-86091234
/\d{3}-\d{8}|\d{4}-\d{7}/
一代身份證號(15位數(shù)字)
/^\d{8}(0\d|11|12)([0-2]\d|30|31)\d{3}$/
二代身份證號(18位數(shù)字),最后一位是校驗位,可能為數(shù)字或字符X
/^\d{6}(18|19|20)\d{2}(0\d|11|12)([0-2]\d|30|31)\d{3}(\d|X|x)$/
身份證號, 支持1/2代(15位/18位數(shù)字)
/(^\d{8}(0\d|11|12)([0-2]\d|30|31)\d{3}$)|(^\d{6}(18|19|20)\d{2}(0\d|11|12)([0-2]\d|30|31)\d{3}(\d|X|x)$)/
帳號是否合法(字母開頭,允許5-16字節(jié),允許字母數(shù)字下劃線組合
/^[a-zA-Z][a-zA-Z0-9_]{4,15}$/
純中文/漢字
/^[\u4E00-\u9FA5]+$/
是否小數(shù)
/^\d+\.\d+$/
電話(座機)
/^0\d{2,3}-\d{7,8}$/
純數(shù)字
/^\d{1,}$/
是否html標簽
/<(.*)>.*<\/\1>|<(.*) \/>/
是否qq號格式正確
/^[1-9][0-9]{4,10}$/
是否由數(shù)字和字母組成
/^[A-Za-z0-9]+$/
純英文字母
/^[a-zA-Z]+$/
純小寫英文字母組成
/^[a-z]+$/
純大寫英文字母
/^[A-Z]+$/
密碼強度正則,最少6位,包括至少1個大寫字母,1個小寫字母,1個數(shù)字,1個特殊字符
/^.*(?=.{6,})(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*? ]).*$/
用戶名正則,4到16位(字母,數(shù)字,下劃線,減號)
/^[a-zA-Z0-9_-]{4,16}$/
ipv4地址正則
/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/
16進制顏色
/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/
微信號,6至20位,以字母開頭,字母,數(shù)字,減號,下劃線
/^[a-zA-Z]([-_a-zA-Z0-9]{5,19})+$/
中國郵政編碼
/^(0[1-7]|1[0-356]|2[0-7]|3[0-6]|4[0-7]|5[1-7]|6[1-7]|7[0-5]|8[013-6])\d{4}$/
只包含中文和數(shù)字
/^(([\u4E00-\u9FA5])|(\d))+$/
非字母
/[^A-Za-z]$/
鏈接:https://juejin.im/post/5d245d4151882555300feb77
來源:掘金
、什么是正則表達式(regular expression)
1) 正則表達式是一描述字符模式的對象;
2) 可以處理更復雜的字符串;
3) javaScript中的正則表達式使用RegExp對象表示;
4)正則表達式用于對字符串模式匹配及檢索替換,是對字符串執(zhí)行模式匹配的工具;
1.語法:var patt=new RegExp(pattem,modifiers) 動態(tài)創(chuàng)建表達式
Var patt=/patterm/modifiers;
2.參數(shù):pattern:描述表達式模式
Modifiers:用于指定全局匹配、區(qū)分大小寫的匹配和多行匹配;
3.常用修飾符:用于執(zhí)行區(qū)分大小寫和全局匹配
1)i 執(zhí)行對大小寫不敏感的匹配;
2)g 執(zhí)行全局匹配(查找所有匹配而非在找到第一個匹配后停止);
3)m 執(zhí)行多行匹配
4.方括號:用于查找某個范圍內(nèi)的字符
1)[abc]:查找方括號之間的字符;
2)[^abc]:查找任何不在方括號之間的字符;
3)[0-9]:查找任何從0至9的數(shù)字;
4)[a-z]:查找任何從小寫a到小寫z的字符;
5)[A-Z]:查找任何從大寫A到大寫Z的字符;
6)[A-z]:查找任何從大寫A到小寫z的字符;
7)[adgk]查找給定集合內(nèi)的 任何字符;
8)[^adgk]:查找給定集合外的任何字符;
9)(red|blue|green):查找任何指定的選項;
5.元字符:(Metacharacter)是擁有特殊含義的字符;
1). :查找單個字符,除了換行和結(jié)束符;
2)\w:查找單詞字符;
3)\W:查找非單詞字符;
4)\d:查找數(shù)字;
5)\D:查找非數(shù)字字符;
6)\s:查找空白字符;
7)\S:查找非空白字符;
8)\b:匹配單詞邊界;
9)\B:匹配非單詞邊界;
10)\0:查找NUL字符;
11)\n:查找換行符;
12)\f:查找換頁符;
13)\r:查找回車符;
14)\t:查找制表符;
15)\v:查找垂直制表符;
16)\xxx:查找以八進制數(shù)xxx規(guī)定的字符;
17)\xdd:查找以十六進制數(shù)dd規(guī)定的字符;
18)\uxxxx:查找以十六進制數(shù)xxxx規(guī)定的Unicode字符;
6.量詞:
1)n+:匹配任何包含至少一個n的字符串;
2)n*:匹配任何包含零個或多個n的字符串;
3)n?:匹配任何包含零個或一個n的字符串;
4)n{x}:匹配包含X個n的序列的字符串;
5)n{X,Y}:匹配包含X或Y個n的序列的字符串;
6)n{X}:匹配包含至少X個n的;
7)n$:匹配任何結(jié)尾為n的字符串;
8)^n:匹配任何開頭為n的字符串;
9)?=n:匹配任何其后緊接指定字符串n的字符串;
10)?!n:匹配任何其后沒有緊接指定字符串n的字符串;
二、正則對象方法:
1.RegExp對象
1)compile(編譯)
語法:ReExpObject.compile(regexp,modifier)
參數(shù):regexp:正則表達式 modifier:模式修飾符;
Compile:用于在腳本執(zhí)行過程中編譯正則表達式或改變和重新編譯正則表達式
2)exec:在目標字符串中執(zhí)行一次正則匹配操作,并將結(jié)果以數(shù)組的形式返回,每次執(zhí)行 exec()函數(shù)都只查找最多一個匹配并返回
語法:RegExpObjec.exec(string)
參數(shù):string指定的字符串;
注:~如果為正則表達式設(shè)置了全局標志(g),exec()函數(shù)仍然只返回最多一個匹配,不過我們再次調(diào)用該對象的exec()函數(shù)就可以查找并返回下一個匹配;
~如果為正則表達式設(shè)置了全局標識g,test函數(shù)仍然只查找最多一個匹配,不過我們再次調(diào)用該對象的test函數(shù)就可以查找下一個匹配;
~如果regExpObject帶有全局標志g,test()函數(shù)不是從字符串的開頭開始查找,而是從屬性regExpObject.lastIndex所指定的索引處開始查找該屬性值默認為0,所以第一次仍熱按是從字符串的開頭查找。當找到一個匹配是,test()函數(shù)會將regExpObject.lastIndex的值改為字符串中能夠本次匹配內(nèi)容的最后一個字符的下一個索引位置,當再次執(zhí)行test()函數(shù)是,將會從該索引位置處開始查找,從而找到下一個匹配。
~當我們使用test()函數(shù)執(zhí)行了一次匹配之后,如果想要重新使用test()函數(shù)從頭開始查找,則需要手動將regExpObject.lastIndex的值重置為0,如果test()函數(shù)在也找不到可以匹配的文本時,該函數(shù)會自動把regExpObject.lastIndex屬性重置為0
3)test(測試):檢測字符串中是否存在正則表達式模式對應(yīng)的匹配,返回值布爾型;
語法: regExpObject.test(str)
參數(shù):string指定的字符串
注:每次執(zhí)行test函數(shù)都只查找最多一個匹配,找到返回true,否則false
2.正則表達式string對象的方法:如果匹配成功,則search()返回正則表達式在字符串中首次匹配項的索引,否則,返回
1)search(搜索):如果匹配成功,則search()返回正則表達式在字符串中首次匹配項的索引,否則,返回-1
語法:str,search(regexp)
參數(shù):regexp一個正則表達式對象,如果傳入一個非正則表達式對象,則會使用new RexExp(obj)隱式地將其轉(zhuǎn)換為正則表達式
注:~~想知道字符串中是否建甌存在某個模式(pattem)時可使用search,類似于正則表達式的test方法
~~了解更多匹配信息是,可使用match(會更慢),該方法類似于正則表達式的exec方法
2)match:當字符串匹配到正則表達式(regular expression)時,match()方法會提取匹配項,如果找到返回匹配結(jié)果的數(shù)組,如果沒有匹配項,則返回null
語法:str,match(regexp)
參數(shù):regexp一個正則表達式對象,如果傳入一個非正則表達式對象,則會隱式地使用new RegExp(obj)將其轉(zhuǎn)換為正則表達式對象
3)replace(替換):replace()方法使用一個替換值(replacement)替換掉一個匹配模式(pattem)在原字符串中某些或所有的匹配項,并返回替換后的字符串。這個替換模式可以是字符串或者RegExp(正則表達式),替換值可以是一個字符串或者一個函數(shù)
語法:str.replace(regexp|substr,newSubStr|function)
參數(shù):regexp,一個RegExp對象,該正則所匹配的內(nèi)容會被第二個參數(shù)的返回值替換掉
Substr:一個要被newSubSTR替換的字符串
newSubStr:替換掉第一個參數(shù)在原字符串中的匹配部分,該字符串中可以內(nèi)插一些特殊的變量名
function:一個用來創(chuàng)建新字符串的函數(shù),該函數(shù)的返回值將替換掉第一個參數(shù)匹配到的結(jié)果注:~~該方法并不改變調(diào)用它的字符串本身,而只是返回替換后的字符串
~~在進行全局的搜索替換時,第一個參數(shù)要么是包含g標志的正則表達式,要么是包含g標志的字符串;
4)split(分割):split()方法通過吧字符串分割成字符串來把一個String對象分割成一個字符串數(shù)組
語法:str.split([separator][,limit])
參數(shù):separator,指定用來分割字符串的字符,separator可以是一個字符串或正則表達式,如果忽略separator,則返回的數(shù)組包含一個由原字符串組成的元素,如果separator是一個空字符串,則str將會轉(zhuǎn)換成一個由原字符串中字符組成的數(shù)組;
Limit:一個整數(shù),限定返回的分割片段數(shù)量,split方法仍然分割每一個匹配的sepparator,單數(shù)返回的數(shù)組只會截取最多l(xiāng)imit個元素
注:~~當找到一個seperator時,sparator會從字符串中被移除,返回存進一個數(shù)組當中的字符串,如果忽略separator參數(shù),則返回的數(shù)組包含一個元素,該元素是原字符串,如果separator是一個空字符串,則str將被轉(zhuǎn)換為由字符串中字符組成的數(shù)組
~~如果separator是一個正則表達式,且包含捕獲括號(capturing parentheses),則每次匹配到separator時,捕獲括號匹配的結(jié)果將會插入到返回的數(shù)組中。
還有,既然學習了正則表達式,就千萬不要忘記這一個用法:
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。