正則詳細(xì)文章 代碼之美卵贱,正則之道
創(chuàng)建正則表達(dá)式
1. 使用一個(gè)正則表達(dá)式字面量
const regex = /^[a-zA-Z]+[0-9]*\W?_$/gi;
2. 調(diào)用RegExp對(duì)象的構(gòu)造函數(shù)
const regex = new RegExp(pattern, [, flags])
特殊字符
^ 匹配輸入的開始
$ 匹配輸入的結(jié)束
* 0次或多次 {0鼻弧,}
+ 1次或多次 {1锣杂,}
?
- 0次或者1次 {0,1}。
-用于先行斷言
-如果緊跟在任何量詞 *洞坑、 +耳高、? 或 {} 的后面,將會(huì)使量詞變?yōu)榉秦澙?/strong>
-對(duì) "123abc" 用 /\d+/ 將會(huì)返回 "123"蕊爵,
-用 /\d+?/,那么就只會(huì)匹配到 "1"。
. 匹配除換行符之外的任何單個(gè)字符
(x) 匹配 'x' 并且記住匹配項(xiàng)
(?:x) 匹配 'x' 但是不記住匹配項(xiàng)
x(?=y) 配'x'僅僅當(dāng)'x'后面跟著'y'.這種叫做正向肯定查找桦山。
x(?!y) 匹配'x'僅僅當(dāng)'x'后面不跟著'y',這個(gè)叫做正向否定查找攒射。
x|y 匹配‘x’或者‘y’。
{n} 重復(fù)n次
{n, m} 匹配至少n次恒水,最多m次
[xyz] 代表 x 或 y 或 z
[^xyz] 不是 x 或 y 或 z
\d 數(shù)字
\D 非數(shù)字
\s 空白字符会放,包括空格、制表符钉凌、換頁符和換行符咧最。
\S 非空白字符
\w 單詞字符(字母、數(shù)字或者下劃線) [A-Za-z0-9_]
\W 非單字字符御雕。[^A-Za-z0-9_]
\3 表示第三個(gè)分組
\b 詞的邊界
/\bm/匹配“moon”中得‘m’
\B 非單詞邊界
使用正則表達(dá)式的方法
- exec 一個(gè)在字符串中執(zhí)行查找匹配的RegExp方法矢沿,它返回一個(gè)數(shù)組(未匹配到則返回null)。
- test 一個(gè)在字符串中測(cè)試是否匹配的RegExp方法饮笛,它返回true或false咨察。
- match 一個(gè)在字符串中執(zhí)行查找匹配的String方法,它返回一個(gè)數(shù)組或者在未匹配到時(shí)返回null福青。
- search 一個(gè)在字符串中測(cè)試匹配的String方法摄狱,它返回匹配到的位置索引脓诡,或者在失敗時(shí)返回-1。
- replace 一個(gè)在字符串中執(zhí)行查找匹配的String方法媒役,并且使用替換字符串替換掉匹配到的子字符串祝谚。
- split 一個(gè)使用正則表達(dá)式或者一個(gè)固定字符串分隔一個(gè)字符串,并將分隔后的子字符串存儲(chǔ)到數(shù)組中的String方法酣衷。
練習(xí)
1交惯、匹配結(jié)尾的數(shù)字
/\d+$/g
2、統(tǒng)一空格個(gè)數(shù)
字符串內(nèi)如有空格穿仪,但是空格的數(shù)量可能不一致席爽,通過正則將空格的個(gè)數(shù)統(tǒng)一變?yōu)橐粋€(gè)。
let reg = /\s+/g
str.replace(reg, " ");
3啊片、判斷字符串是不是由數(shù)字組成
str.test(/^\d+$/);
4只锻、電話號(hào)碼正則
區(qū)號(hào)必填為3-4位的數(shù)字
區(qū)號(hào)之后用“-”與電話號(hào)碼連接電話號(hào)碼為7-8位的數(shù)字
分機(jī)號(hào)碼為3-4位的數(shù)字,非必填紫谷,但若填寫則以“-”與電話號(hào)碼相連接
/^\d{3,4}-\d{7,8}(-\d{3,4})?$/
5齐饮、手機(jī)號(hào)碼正則表達(dá)式
正則驗(yàn)證手機(jī)號(hào),忽略前面的0笤昨,支持130-139祖驱,150-159熙暴。忽略前面0之后判斷它是11位的啡捶。
/^0*1(3|5)\d{9}$/
6、使用正則表達(dá)式實(shí)現(xiàn)刪除字符串中的空格
funtion trim(str) {
let reg = /^\s+|\s+$/g
return str.replace(reg, '');
}
7拇舀、限制文本框只能輸入數(shù)字和兩位小數(shù)點(diǎn)等等
/^\d*\.\d{0,2}$/
8根竿、只能輸入小寫的英文字母和小數(shù)點(diǎn)陵像,和冒號(hào),正反斜杠(:./)
/^[a-z\.:\/\\]*$/
9寇壳、替換小數(shù)點(diǎn)前內(nèi)容為指定內(nèi)容
例如:infomarket.php?id=197 替換為 test.php?id=197
var reg = /^[^\.]+/;
var target = '---------';
str = str.replace(reg, target)
10、只匹配中文的正則表達(dá)式
/[\u4E00-\u9FA5\uf900-\ufa2d]/ig
返回字符串的中文字符個(gè)數(shù)
先去掉非中文字符妻怎,再返回length屬性壳炎。
function cLength(str){
var reg = /[^\u4E00-\u9FA5\uf900-\ufa2d]/g;
//匹配非中文的正則表達(dá)式
var temp = str.replace(reg,'');
return temp.length;
}
11、正則表達(dá)式取得匹配IP地址前三段
只要匹配掉最后一段并且替換為空字符串就行了
function getPreThrstr(str) {
let reg = /\.\d{1,3}$/;
return str.replace(reg,'');
}
12逼侦、匹配<ul>與</ul>之間的內(nèi)容
/<ul>[\s\S]+?</ul>/i
13匿辩、用正則表達(dá)式獲得文件名
c:\images\tupian\006.jpg
可能是直接在盤符根目錄下,也可能在好幾層目錄下榛丢,要求替換到只剩文件名铲球。
首先匹配非左右斜線字符0或多個(gè),然后是左右斜線一個(gè)或者多個(gè)晰赞。
function getFileName(str){
var reg = /[^\\\/]*[\\\/]+/g;
// xxx\ 或是 xxx/
str = str.replace(reg,'');
return str;
}
14稼病、絕對(duì)路徑變相對(duì)路徑
"http://23.123.22.12/image/somepic.gif"轉(zhuǎn)換為:"/image/somepic.gif"
var reg = /http:\/\/[^\/]+/;
str = str.replace(reg,"");
15选侨、用戶名正則
用于用戶名注冊(cè),然走,用戶名只 能用 中文援制、英文、數(shù)字芍瑞、下劃線晨仑、4-16個(gè)字符。
/^[\u4E00-\u9FA5\uf900-\ufa2d\w]{4,16}$/
16拆檬、匹配英文地址
規(guī)則如下:
包含 "點(diǎn)", "字母","空格","逗號(hào)","數(shù)字"洪己,但開頭和結(jié)尾不能是除字母外任何字符。
/^[a-zA-Z][\.a-zA-Z,0-9]*[a-zA-Z]$/
17竟贯、正則匹配價(jià)格
開頭數(shù)字若干位答捕,可能有一個(gè)小數(shù)點(diǎn),小數(shù)點(diǎn)后面可以有兩位數(shù)字澄耍。
/^\d+(\.\d{2})?$/
18噪珊、身份證號(hào)碼的匹配
身份證號(hào)碼可以是15位或者是18位,其中最后一位可以是X齐莲。其它全是數(shù)字
/^(\d{14}|\d{17})(X|x)$/
19痢站、單詞首字母大寫
每單詞首字大寫,其他小寫选酗。如blue idea轉(zhuǎn)換為Blue Idea阵难,BLUE IDEA也轉(zhuǎn)換為Blue Idea
function firstCharUpper(str) {
str = str.toLowerCase();
let reg = /\b(\w)/g;
return str.replace(reg, m => m.toUpperCase());
}
20、正則驗(yàn)證日期格式
yyyy-mm-dd格式
4位數(shù)字芒填,橫線呜叫,1或者2位數(shù)字,再橫線殿衰,最后又是1或者2位數(shù)字朱庆。
/^\d{4}-\d{1,2}-\d{1,2}$/
21、去掉文件的后綴名
www.abc.com/dc/fda.asp 變?yōu)?www.abc.com/dc/fda
function removeExp(str) {
return str.replace(/\.\w$/,'')
}
22闷祥、驗(yàn)證郵箱的正則表達(dá)式
開始必須是一個(gè)或者多個(gè)單詞字符或者是-娱颊,加上@,然后又是一個(gè)或者多個(gè)單詞字符或者是-凯砍。然后是點(diǎn)“.”和單詞字符和-的組合箱硕,可以有一個(gè)或者多個(gè)組合。
/^[\w-]+@\w+\.\w+$/
23悟衩、正則判斷標(biāo)簽是否閉合
例如:<img xxx=”xxx” 就是沒有閉合的標(biāo)簽剧罩;
<p>p的內(nèi)容,同樣也是沒閉合的標(biāo)簽座泳。
標(biāo)簽可能有兩種方式閉合惠昔,<img xxx=”xxx” /> 或者是<p> xxx </p>幕与。
/<([a-z]+)(\s*\w*?\s*=\s*".+?")*(\s*?>[\s\S]*?(<\/\1>)+|\s*\/>)/i
24、正則判斷是否為數(shù)字與字母的混合
不能小于12位舰罚,且必須為字母和數(shù)字的混
/^(([a-z]+[0-9]+)|([0-9]+[a-z]+))[a-z0-9]*$/i
25纽门、將阿拉伯?dāng)?shù)字替換為中文大寫形式
function replaceReg(reg,str){
let arr=["零","壹","貳","叁","肆","伍","陸","柒","捌","玖"];
let reg = /\d/g;
return str.replace(reg,function(m){return arr[m];})
}
26、去掉標(biāo)簽的所有屬性
<td style="width: 23px; height: 26px;" align="left"></td>
變成沒有任何屬性的
<td></td>
思路:非捕獲匹配屬性营罢,捕獲匹配標(biāo)簽赏陵,使用捕獲結(jié)果替換掉字符串。正則如下:
/(<td)\s(?:\s*\w*?\s*=\s*".+?")*?\s*?(>)/