正則表達式
創(chuàng)建正則表達式
- 使用一個正則表達式字面量
const regex = /^[a-zA-Z]+[0-9]*\W?_$/gi;
- 調(diào)用 RegExp 對象的構(gòu)造函數(shù)
const regex = new RegExp(pattern, [, flags]);
特殊字符
- ^ 匹配輸入的開始
- $ 匹配輸入的結(jié)束
- * 0 次或多次 {0,}
- + 1 次或多次 {1宁脊,}
- ?
- 0 次或者 1 次 {0,1}掌实。
- 用于先行斷言
- 如果緊跟在任何量詞 *、 +狸棍、? 或 {} 的后面,將會使量詞變?yōu)榉秦澙?
- 對 "123abc" 用 /\d+/ 將會返回 "123",
- 用 /\d+?/,那么就只會匹配到 "1"粒蜈。
- . 匹配除換行符之外的任何單個字符
- (x) 匹配 'x' 并且記住匹配項
- (?:x) 匹配 'x' 但是不記住匹配項
- x(?=y) 配'x'僅僅當'x'后面跟著'y'.這種叫做正向肯定查找。
- x(?!y) 匹配'x'僅僅當'x'后面不跟著'y',這個叫做正向否定查找术唬。
- x|y 匹配‘x’或者‘y’薪伏。
- {n} 重復 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 表示第三個分組
- \b 詞的邊界
- /\bm/匹配“moon”中得‘m’蚂斤;
- \B 非單詞邊界
使用正則表達式的方法
- exec 一個在字符串中執(zhí)行查找匹配的 RegExp 方法存捺,它返回一個數(shù)組(未匹配到則返回 null)。
- test 一個在字符串中測試是否匹配的 RegExp 方法,它返回 true 或 false捌治。
- match 一個在字符串中執(zhí)行查找匹配的 String 方法岗钩,它返回一個數(shù)組或者在未匹配到時返回 null。
- search 一個在字符串中測試匹配的 String 方法肖油,它返回匹配到的位置索引兼吓,或者在失敗時返回-1。
- replace 一個在字符串中執(zhí)行查找匹配的 String 方法森枪,并且使用替換字符串替換掉匹配到的子字符串视搏。
- split 一個使用正則表達式或者一個固定字符串分隔一個字符串,并將分隔后的子字符串存儲到數(shù)組中的 String 方法县袱。
練習
匹配結(jié)尾的數(shù)字
/\d+$/g;
統(tǒng)一空格個數(shù)
字符串內(nèi)如有空格浑娜,但是空格的數(shù)量可能不一致,通過正則將空格的個數(shù)統(tǒng)一變?yōu)橐粋€式散。
let reg = /\s+/g;
str.replace(reg, " ");
判斷字符串是不是由數(shù)字組成
str.test(/^\d+$/);
電話號碼正則
- 區(qū)號必填為 3-4 位的數(shù)字
- 區(qū)號之后用“-”與電話號碼連接電話號碼為 7-8 位的數(shù)字
- 分機號碼為 3-4 位的數(shù)字筋遭,非必填,但若填寫則以“-”與電話號碼相連接
/^\d{3,4}-\d{7,8}(-\d{3,4})?$/;
手機號碼正則表達式
正則驗證手機號杂数,忽略前面的 0宛畦,支持 130-139,150-159揍移。忽略前面 0 之后判斷它是 11 位的次和。
/^0*1(3|5)\d{9}$/;
使用正則表達式實現(xiàn)刪除字符串中的空格
funtion trim(str) {
let reg = /^\s+|\s+$/g
return str.replace(reg, '');
}
限制文本框只能輸入數(shù)字和兩位小數(shù)點等等
/^\d*\.\d{0,2}$/;
只能輸入小寫的英文字母和小數(shù)點,和冒號那伐,正反斜杠(:./)
/^[a-z\.:\/\\]*$/;
替換小數(shù)點前內(nèi)容為指定內(nèi)容
例如:infomarket.php?id=197 替換為 test.php?id=197
var reg = /^[^\.]+/;
var target = "---------";
str = str.replace(reg, target);
只匹配中文的正則表達式
/[\u4E00-\u9FA5\uf900-\ufa2d]/gi;
返回字符串的中文字符個數(shù)
先去掉非中文字符踏施,再返回 length 屬性。
function cLength(str) {
var reg = /[^\u4E00-\u9FA5\uf900-\ufa2d]/g;
//匹配非中文的正則表達式
var temp = str.replace(reg, "");
return temp.length;
}
正則表達式取得匹配 IP 地址前三段
只要匹配掉最后一段并且替換為空字符串就行了
function getPreThrstr(str) {
let reg = /\.\d{1,3}$/;
return str.replace(reg, "");
}
匹配<ul>與</ul>之間的內(nèi)容
/<ul>[\s\S]+?</ul>/i
用正則表達式獲得文件名
c:\images\tupian\006.jpg
可能是直接在盤符根目錄下,也可能在好幾層目錄下,要求替換到只剩文件名护姆。
首先匹配非左右斜線字符 0 或多個,然后是左右斜線一個或者多個日熬。
function getFileName(str) {
var reg = /[^\\\/]*[\\\/]+/g;
// xxx\ 或是 xxx/
str = str.replace(reg, "");
return str;
}
絕對路徑變相對路徑
"http://23.123.22.12/image/somepic.gif"轉(zhuǎn)換為:"/image/somepic.gif"
var reg = /http:\/\/[^\/]+/;
str = str.replace(reg, "");
用戶名正則
用于用戶名注冊,肾胯,用戶名只 能用 中文竖席、英文、數(shù)字敬肚、下劃線毕荐、4-16 個字符。
/^[\u4E00-\u9FA5\uf900-\ufa2d\w]{4,16}$/;
匹配英文地址
規(guī)則如下:
包含 "點", "字母","空格","逗號","數(shù)字"艳馒,但開頭和結(jié)尾不能是除字母外任何字符憎亚。
/^[a-zA-Z][\.a-zA-Z,0-9]*[a-zA-Z]$/;
正則匹配價格
開頭數(shù)字若干位,可能有一個小數(shù)點,小數(shù)點后面可以有兩位數(shù)字第美。
/^\d+(\.\d{2})?$/;
身份證號碼的匹配
身份證號碼可以是 15 位或者是 18 位蝶锋,其中最后一位可以是 X。其它全是數(shù)字
/^(\d{14}|\d{17})(X|x)$/;
單詞首字母大寫
每單詞首字大寫斋日,其他小寫牲览。如 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());
}
正則驗證日期格式
yyyy-mm-dd 格式
4 位數(shù)字恶守,橫線,1 或者 2 位數(shù)字贡必,再橫線兔港,最后又是 1 或者 2 位數(shù)字。
/^\d{4}-\d{1,2}-\d{1,2}$/;
去掉文件的后綴名
www.abc.com/dc/fda.asp 變?yōu)?www.abc.com/dc/fda
function removeExp(str) {
return str.replace(/\.\w$/, "");
}
驗證郵箱的正則表達式
開始必須是一個或者多個單詞字符或者是-仔拟,加上@衫樊,然后又是一個或者多個單詞字符或者是-。然后是點“.”和單詞字符和-的組合利花,可以有一個或者
多個組合科侈。
/^[\w-]+@\w+\.\w+$/;
正則判斷標簽是否閉合
例如:<img xxx=”xxx” 就是沒有閉合的標簽;
<p>p的內(nèi)容炒事,同樣也是沒閉合的標簽臀栈。
標簽可能有兩種方式閉合,<img xxx=”xxx” /> 或者是<p> xxx </p>挠乳。
/<([a-z]+)(\s*\w*?\s*=\s*".+?")*(\s*?>[\s\S]*?(<\/\1>)+|\s*\/>)/i;
正則判斷是否為數(shù)字與字母的混合
不能小于 12 位权薯,且必須為字母和數(shù)字的混
/^(([a-z]+[0-9]+)|([0-9]+[a-z]+))[a-z0-9]*$/i;
將阿拉伯數(shù)字替換為中文大寫形式
function replaceReg(reg, str) {
let arr = ["零", "壹", "貳", "叁", "肆", "伍", "陸", "柒", "捌", "玖"];
let reg = /\d/g;
return str.replace(reg, function (m) {
return arr[m];
});
}
去掉標簽的所有屬性
<td style="width: 23px; height: 26px;" align="left"></td>
變成沒有任何屬性的
<td></td>
思路:非捕獲匹配屬性,捕獲匹配標簽睡扬,使用捕獲結(jié)果替換掉字符串盟蚣。正則如下:
/(<td)\s(?:\s*\w*?\s*=\s*".+?")*?\s*?(>)/