JS正則:java RegExp對象,它是對字符串執行模式匹配的強大工具。運用最多的就是在輸入處驗證輸入的字符串是否合法,指定用戶輸入字符串的格式。
定義方法:
1:直接量語法:var re=/pattern/attributes
2:創建RegExp對象法:var re=new RegExp("pattern","attributes")
pattern:這里可以是字符串,也可以是正則表達式對象。 //注:當使用創建RegExp對象法時,如果pattern是正則表達式,則不用寫第二個參數。
attributes:匹配方式。它只有三個參數:i,g,m。 i:表示不區分大小寫匹配。g:查找所有匹配,而非查找到第一個就停止。m:多行匹配。
例:var re=/a/ig var re=new RegExp("a","ig") //表示匹配所有的a和A。這兩種寫法是一樣的。
正則表達式的定義規則(這里主要講如何書寫pattern參數):
1:方括號[]:表示匹配括號中的所有字符
var re=/[a-z]/ //表示滿足小寫a-z的字符串 如:a34vas3
var re1=/[abc][def0-9]/ //表示兩個滿足條件並且要相鄰的字符串 如:5a8zcf
2:花括號{}:表示匹配多少個字符,通常與方括號[]一起使用
var re =/[a-z]{3}/ //表示要有連續的三個小寫字母的字符串 如:t34bgp5jip8
/** var re1=/[a]{1-3}/ //表示滿足連續三個a的字符串 如:rgb89aaacd 這種寫法是錯誤的,並沒有這種1-3的寫法**/
var re2=/[a]{1,3}/ //逗號,表示或者的意思 這里灰色之前是有誤解,{1,3}表示區間,表示大於等於1,小於等於3個都是可以的 如:rabcaaadaa
3:小括號():表示提取字符串,匹配到的字符串可以通過$0-9可獲取匹配的字符串,這個會在后面的例子中介紹到。
三種括號的更多使用可以參照:https://www.cnblogs.com/signheart/p/20a396bdbdeb9aa446663395eea4e3c4.html
4:^符號:
4.1表示匹配一個字符串的開頭 var re=/^[a-z]/ //表示以小寫字母開頭的字符串 如:a45jdkl
4.2如果^符號出現在[]中的第一個字符位置,表示不包含此字符串 var re=/[^a] //表示字符串中不能有a 如:rgb123
5:$符號:表示匹配一個字符串的結尾
var re=/d$/ //表示以d結尾的字符串 如:abcd
6:轉義字符 \
字符 | 描述 | 備注 |
. | 查找單個字符,除了換行和行結束符。 | |
\w | 查找單詞字符 | 等價於[A-Za-z0-9] |
\W | 查找非單詞字符 | 等價於[^A-Za-z0-9] |
\d | 查找數字。 | 等價於[0-9] |
\D | 查找非數字字符。 | 等價於[^0-9] |
\s | 查找空白字符。 | 包括空格、TAB、換頁符 |
\S | 查找非空白字符。 | |
\b | 匹配單詞邊界 | |
\B | 匹配非單詞邊界。 | |
\0 | 查找 NUL 字符。 | |
\n | 查找換行符。 | |
\f | 查找換頁符。 | |
\r | 查找回車符 | |
\t | 查找制表符。 | |
\v | 查找垂直制表符。 | |
\xxx | 查找以八進制數 xxx 規定的字符。 | |
\xdd | 查找以十六進制數 dd 規定的字符。 | |
\uxxxx | 查找以十六進制數 xxxx 規定的 Unicode 字符。 |
7:量詞
量詞 | 描述 | 例子 |
n+ | +號表示匹配任何包含至少一個 n 的字符串 | var re=/\d+/ 如:abc1de234fg56 |
n* | 匹配任何包含零個或多個 n 的字符串。 | var re=/ab*/ 如:a123abb |
n? | 匹配任何包含零個或一個 n 的字符串 | var re=/do(es)?/ 如:doAnddoes |
n{X} | 匹配包含 X 個 n 的序列的字符串。 | var re=/[0-9]{2}/ 如:a12b34c56 |
n{X,Y} | 匹配包含 X 或 Y 個 n 的序列的字符串。 | var re=/[0-9]{2,3}/ 如:a12b345 |
n{X,} | 匹配包含至少 X 個 n 的序列的字符串。 | var re=/[0-9]{2,} 如:a12b345c6789 |
?=n | 匹配任何其后緊接指定字符串 n 的字符串 | var re=/a(?=12|34) 如:a12a34a67 |
?!n | 匹配任何其后沒有緊接指定字符串 n 的字符串。 | var re=/a(?!12|34) 如a66a77a12 |
一些常用的javaScript正則表達式:
1:用戶名正則
var userPattern=/^[a-zA-Z0-9-_]{4-16}$/ //用戶名只能由4-16位的大小寫字母、數字、-、_組成
2:密碼強度正則
var passPattern=/^.*(?=.{6,})(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*?]).*$/ //至少是有6位,必須至少要有一個數字、大小寫字母,特殊字符
3:整數正則
var intPattern=/^\d+$/正整數 var intPattern1=/^-\d$/負整數 var intPattern2=/^-?\d$/所有整數
4:Email正則
var emailPattern=/^([a-zA-Z0-9_\-\.])+\@([a-zA-Z0-9_\-\.])+\.([a-zA-Z]{2-4})$/ //注:這里的+號不是連接,而是與前面的小括號連接,表示要有一個或多個字符
5:中文正則
var chinesePattern=/^[\u4e00-\u9fa5]+$/
6:手機號碼正則
var iphonePattern=/^(1[0-9]{10})$/
這里只列舉了一部分常用的正則,如有需要可查看更多正則:http://www.jqhtml.com/6915.html //日期正則,身份證正則,URL正則,IPV4正則等。
正則表達式的方法:
1:test()方法:在字符串中查找符合正則的內容,若查找得到返回true,否則false;
格式:正則.test(字符串);
emailPattern.test("123_456@qq_mail.com") //返回true
2:search()方法:搜索符合正則的第一次出現的位置,若搜索到返回第一次出現的位置,否則返回-1。
格式:字符串.search(正則);
var str="abcd@mail.com"; str.search(/@/); //返回4
3:match()方法:獲取正則匹配的結果,以數組的形式返回。
格式:字符串.match(正則);
"123ab45cd678".match(/\d+/g); //返回 [123,45,678],若這里不是全局匹配則返回["123",index:0,"123ab45cd678"],就只會返回第一個
4:exec()方法:捕獲符合正則的字符串,若捕獲到符合正則的字符串返回一個Array的實例,但它包含了兩個額外的屬性index和input。index表示符合正則字符串出現的位置;input表示字符串表達式的字符串。
格式:正則.exec(字符串)
var textArray=/.bc/.exec("abc12abc3abc45"); //textArray.index=0;textArray.input="abc12abc3abc45";textArray[0]=abc;
var textArray=/.bc/g.exec("abc12bbc3cbc45"); //textArray.index=0;textArray[0]="abc";textArray[1]="bbc";textArray[2]="cbc";
5:replace方法:用於在字符串中用一些字符替換另一些字符,或替換一個與正則表達式匹配的子串。
格式:字符串.replace(正則|字符串,字符串|回調函數)
5.1字符串.replace(字符串,字符串|回調函數) //這里回調函數必須返回的是一個字符串
"abcde12345abc".replace("abc","mmm"); //return:mmmde12345abc
5.2字符串.replace(正則,字符串)
"abcde12345abc".replace(/abc/g,"mmm"); //return:mmmde12345mmm
5.3字符串.replace(正則,回調函數)
每匹配到一個正則就會調用一次回調函數,每次回調都會傳遞以下參數:
result:本次匹配到的結果
$1-$9:正則中有多少個()就表示有多少個參數
offset:記錄本次匹配的開始位置
source:接受匹配的原始字符串
replace搭配JS正則的一些案例:
5.3.1:去掉字符串兩邊的空格
" abc ".replace(/(^\s+)|(\s+$)/g,function(){
return "";
})
5.3.2:提取URL中的參數和參數值
var obj={};
var url="www.emilzs.com/action?name=emilzs&age=18"
url.replace(/([^&=]+)=([^&=]*)/gi,function(rs,$1,$2){
obj[$1]=$2; //注:當第一次匹配到正則時$1為name,$2為emilzs。當第二次匹配到正則時$1為age,$2為18
})
5.3.4:在指定位置插入新字符串
str.replace(/(.{3})/,function(rs,$1){
return $1+"xyz"; //注:其實這種方法的意思就是將str字符串前3個字符替換成前3個字符+"xyz"
})
5.3.5:將電話號碼加密
var str=number.slice(3,7);
number.replace(new RegExp(str,g),"******"); 15123456789 --> 151*****789