正則表達式也是js里面的一個對象
創建一個正則表達式
可以這樣創建一個:var reg2=new RegExp("abc"); //RegExp是正則對象的構造函數
也可以通過標記的形式創建:var reg1=/abc/; //其中的' // '是標記,abc表示要匹配的字符
正則表達式匹配
var reg=/b/; //匹配字符串中的b字符
reg.test("abc");
//正則表達式的test用來檢測字符串是否滿足正則表達式的要求;
//由於"abc"中存在b,所以是符合要求的,所以這段代碼的返回值為:true
const isTrue = reg.test("coke"); //由於"coke"中不存在b字符,所以不符合條件 -->isTrue:false
var reg2=/abc/;
reg2.test("adbcd"); //字符串中必然存在"abc"才符合要求,所以這段代碼的返回值為false
reg2.test("1abc"); //true
reg2.test("abc123"); //true
reg2.test("abcabc"); //true
正則表達式特殊字符
字符類別
. 表示除了換行符(\r \n)以外的任意字符
var reg=/./;
reg.test("a"); //true
reg.test("."); //true
reg.test("\r"); //false
reg.test("1\r"); //存在一個1,不是換行符,所以結果為:true
reg.test("\r\n"); //false
//注意點:如果以后要匹配.字符,不要直接寫.
//為了匹配qq郵箱,寫了 /qq.com/ 這是一個錯誤的寫法:
//=>/qq.com/不僅匹配:"qq.com"也匹配"qq1com" "qq@com"
//解決方案:/qq\.com/ 或者 /qq[.]com/
\d 表示數字
var reg=/\d/;
reg.test("1abc"); //由於存在一個數字,所以結果為true
reg.test("abcde"); //由於不存在任何數字,所以結果為false
//擴展:
var _reg=/\d\d/;
_reg.test("1b"); //不存在2個連續數字,所以結果為:false
_reg.test("a12c"); //存在2個連續數字,結果為:true
\D 是\d的取反結果,表示不是數字
var reg=/\D/;
reg.test("123"); //由於全是數字,所以結果為:false
reg.test("123a"); //存在一個字母,所以結果為:true
var reg2=/123\D5/;
reg2.test("12345"); //false
reg2.test("123b5"); //true
\w 匹配字母、數字、下划線 ,三者滿足其一即可
var reg=/\w/;
reg.test("123"); //存在數字,結果為:true
reg.test("a"); //true
reg.test("1"); //true
reg.test("_"); //true
reg.test("-"); //false
reg.test("."); //false
reg.test("1."); //true
reg.test("_\r"); //true
reg.test("\r"); //false
\W 是\w的取反
\s 表示一個空白字符(例如:\r \n \t 空格 。。。)
var reg=/\s/;
reg.test("abc def"); //存在一個空白,結果為:true
reg.test("abc\r123"); //存在一個\r,結果為:true
reg.test("abc"); //false
\S 是\s的取反
var reg=/\S/;
reg.test(" \r \n "); //全是空白字符,結果為false
reg.test("123 abc"); //存在一個空白,結果為true
var reg3=/\s\S/;
reg3.test(" a"); //true
reg3.test("a "); //存在空白字符和非空白字符,但不符合正則的順序,false
reg3.test("a b"); //true
\ 轉義字符
var reg=/\./; //匹配.字符
var reg=/\//; //匹配一個正斜杠:/
字符集合
[ ]
var reg=/[1a2b3]/; //匹配這5個字符中的其中一個,只要滿足其中,就是符合要求的
reg.test("a"); //結果為:true
reg.test("3"); //結果為:true
reg.test("cd56789"); //一個符合要求的字符都不存在,結果為:false
reg.test("a55555"); //結果為:true
var reg2=/[123][abc]/;
reg2.test("2a"); //true
reg2.test("3c"); //true
reg2.test("defgh1c"); //存在符合條件的1c,結果為:true
reg2.test("39"); //不滿足
var reg2=/[0-9]/; //匹配數字0-9之間,任何一個數字 等價於:/\d/
var reg3=/[a-z]/; //匹配小寫字母
var reg4=/[A-Z]/; //匹配大寫字母
var reg5=/[a-zA-Z]/;//匹配所有字母
var reg6=/[A-Za-z]/;//..........
var reg10=/[0-9abc]/;
reg10.test("3");//true
reg10.test("five");//false
reg10.test("banana");//true
[^]
var reg=/[^123]/; //不是1 並且 不是2 並且 不是3
reg.test("a"); //true
reg.test("3"); //false
reg.test("123"); //沒有1,2,3以外的字符,結果為:false
邊界
^ 表示字符串最左邊
$ 表示字符串最右邊
var reg=/^abc/; //表示以abc開頭
reg.test("123abc123"); //並不是以abc開頭,結果為:false
reg.test("abc123"); //以abc開頭,結果為:true
var reg=/abc$/; //表示以abc結尾
reg.test("123abc"); //結果為:true
reg.test("abc123"); //結果為:false
var reg=/^abc$/; //表示字符串abc
reg.test("abc"); //結果為:true
reg.test("123abc"); //結果為:false
量詞
* 出現0次或多次
var reg=/\d*/;
reg.test("123"); //true
reg.test("234"); //true
reg.test(""); //true
var reg3=/1\d*/;
reg3.test("123"); //true
reg3.test("a123") //true
reg3.test("a2b"); //false
+ 出現1次或多次
? 出現0次或一次
{3} 出現3次
{3,} 至少出現3次
{3,5} 出現3-5次
var reg=/abc{3}/; //表示匹配abccc
reg.test("123abccc123"); //結果為:true
| 或者
var reg=/abc|123/; //表示匹配abc或者123
() 分組
var reg=/(\d{3-4})-(\d{7,8})/;
var arr="021-33335555".match(/(\d{3,4})-(\d{7,8})/); //這個方法是查找一個或多個正則表達式的匹配。
arr[0] //全部
arr[1] //021
arr[2] //333355555
var reg=/(\d{3-4})-(\d{7,8})/;
var str = "021-33335555";
str.replace(/(\d{3,4})-(\d{7,8})/,'$1'); //這個方法是在字符串中查找匹配的子串, 並替換與正則表達式匹配的子串。
//021 返回分組后'$1'對應的字符串替換正則匹配到的所有字符
str.replace(/(\d{3,4})-(\d{7,8})/,'$2'); //33335555 返回分組后'$2'對應的字符串替換正則匹配到的所有字符
案例:匹配手機號碼(國內)
var reg =/^1[3-9][0-9]\d{8}$/;