1.聲明方法
- new RegExp()
var a= new RegExp('xyz'); //等同于/xyz/
var b= new RegExp("\\s"); //等同于/\s/
var c =new RegExp("\s"); //等同于/s/ 這里注意 使用new聲明正則的時候如果存在轉譯就會消耗一個"\"符號
- 直接書寫
var a=/xyz/;
var b=/\s/;
2.正則對象的屬性和方法
- 修飾符屬性
與修飾符有關的屬性,返回一個布爾值
>ignoreCase :表示不區分大小寫
>global :表示是否全局匹配
>multiline :表示是否多行匹配
var a=/xyz/igm;
a.ignoreCase // true;
a.global //true;
a.mulitline //true;
- 另外有一些與修飾符無關的屬性,主要有兩個
>lastindex 下一次匹配的位置,要跟修飾符g一起用
>source 正則的字符串形式
var a= /xyz/igm;
var b=/\s/igm;
a.lastindex; //0 從頭開始
b.source ; //"\s"
- 方法
- test() 返回Boolean值 表示當前正則是否能夠匹配字符串
>正則中沒有修飾符g,則只匹配一次
- test() 返回Boolean值 表示當前正則是否能夠匹配字符串
/x/.test("_x_x");
/y/.test("_x_x");
>正則中有修飾符g ,則多次匹配
var a=/x/g;
var s="_x_x";
a.test(s); //true;
a.lastIndex; //2;
a.test(s); //true;
a.lastIndex //4;
- exec(): 如果發現匹配,則返回一個數組,如果沒有匹配 則返回null;
var s="_x_x";
/x/.exec(s); //["x"]
/y/.exec(s) //null
>使用exec()如果正則中有() 則含有組匹配 如果成功匹配 則返回的數組中第一個值是匹配成功的值,第二個值組內匹配的值 ,如果存在多個組匹配則數組長度+1,位置依次類推。
var a = /_(x)/;
a.exec("_x_x") //["_x","x"]
var b=/a(b)(c)/;
b.exec("abc") // ["abc",b,c]
> 使用exec()返回的數組中有兩個屬性 一個是input 另一個是index
var a=/a(b+)a/g;
var s="_abbba_aba"
var a1=a.exec(s);
a1.index //1 從字符串第二位成功匹配
a1.input //"_abbba_aba" 匹配的原字符串
> 如果正則中含有修飾符g則可以多次使用exec()進行匹配
var a=/a(b+)a/g;
var s="_abbba_aba"
var a1=a.exec(s);
console.log(a1); //["abbba","bbb"]
console.log(a.lastIndex); // 6
var a2=a.exec(s);
console.log(a2); //["aba","b"]
console.log(a.lastIndex); // 10
var a3=a.exec(s);
console.log(a3); // null 本次的匹配位置是10 字符串最大索引是9 所以null
console.log(a.lastIndex); //undefined
var a4=a.exec(s);
console.log(a4.index); //index=1 重新開始匹配
console.log(a3); //["abbba","bbb"]
console.log(a.lastIndex); // 6
3.字符串的屬性和方法
- search
>如果匹配成功則返回第一個滿足匹配字符串的位置,如果沒有匹配成功則返回-1
var s="_x_x";
s.match(/x/); //1
s.match(/y/); //-1
- match
>如果不帶修飾符g 則返回第一次匹配值組成的數組 如果沒有成功則返回null
var s="_x_x";
s.match(/x/); //["x"]
s.match(/y/); //null
>如果帶修飾符g 則返回所有匹配組成的數組
var s="_x_x";
s.match(/x/g); //["x","x"]
>如果存在組匹配,如果成功匹配,數組的第一個值是匹配結果,第二個值是組內匹配結果,依次類推。
var s="_abba_aba";
s.match(/a(b+)a/); ["abba","bb"]
- split
>函數調用:str.split(separator, [limit])
返回值是一個數組。參數第一個參數可以是正則,第二個參數可以限定返回數組的長度,
var s="a, b, c,d"
var arr=s.split(/,\s*/); //其中\s* 代表匹配0到多個空格
console.log(arr) //["a", "b", "c", "d"]
var arr2=s.split(/,\s*/,2)
console.log(arr2) //["a", "b"]
- replace
>函數調用:str.replace(search, replacement)replace()返回值是一個新的字符串。
>>參數第一個值可以是正則 正則可以帶修飾符g,帶g的情況下會做全局匹配替換
var s="aaa"
var s1=s.replace(/a/,"b") //s1="baa"
var s2=s.replace(/a/g,"b") //s2="bbb"
>>參數第二個值可以是替換的字符串,也可以是$符號組成的參數,也可以是函數
$符號
$& 指代匹配的子字符串。
$` 指代匹配結果前面的文本。
$' 指代匹配結果后面的文本。 //其中'符號需要轉譯 $'
$n 指代匹配成功的第n組內容,n是從1開始的自然數。
$$ 指代美元符號$
var s1="hello world".replace(/(\w+) (\w+)/,"$2 $1"); //"world hello"
var s2=('abc').replace(/b/,"[$`-$&-$\']") //"a[a-b-c]c"
function
var s='123';
var s2=s.replace(/\d/g,function(match){
return match*2;
}); //s2="246";
4.常用的一些寫法
<pre>
\d :匹配數字 相當于[0-9]
\w:匹配字母數字下劃線相當于[A-Za-z0-9_]
\s :匹配空格(包括制表符、空格符、斷行符等) 相當于[\t\n\r\v\f]
[a-zA-Z0-9]: 匹配所有字母和數字
5.特殊字符
\cX 表示Ctrl-[X],其中的X是A-Z之中任一個英文字母,用來匹配控制字符。
[\b] 匹配退格鍵(U+0008),不要與\b混淆。
\n 匹配換行鍵。
\r 匹配回車鍵。
\t 匹配制表符tab(U+0009)。
\v 匹配垂直制表符(U+000B)。
\f 匹配換頁符(U+000C)。
\0 匹配null字符(U+0000)。
\xhh 匹配一個以兩位十六進制數表示的字符。
\uhhhh 匹配一個以四位十六進制數表示的unicode字符。
6.貪婪模式與非貪婪模式(+、*、?)
+符號和*符號默認是盡可能的匹配更多的字符,這就是貪婪模式。
如果在后面加上問號,就會變成一旦滿足條件后就不再匹配 這就是非貪婪模式。
*?:表示某個模式出現0次或多次,匹配時采用非貪婪模式
+?:表示某個模式出現1次或多次,匹配時采用非貪婪模式。
/a+/.exec("aaa"); //["aaa"]
/a+?/.exec("aaa); //["a"] //滿足有一個a即可
/a+?b/.exec("aab") //["aab"] //滿足一個或者多個a后面有一個b
/a*?b/.exec("aab"); //["aab"] //滿足0個或者多個a后面有一個b
/a*?b/.exec("b") //["b"] //沒有a直接返回b
6.組匹配
- 定義:就匹配就是用括號包裹起來形成一個整體
var s="abcabc"
s.match(/abc+/); //["abc"] 沒有括號 只有c受到了加號的影響
s.match(/(abc)+/); //["abcabc", "abc"]
- 組匹配可以使用\n來替代組中的內容,還可以嵌套使用
var s="abc_cab";
/(..)(.)_\2\1/.test(s); //其中\2代表的是ab\1代表的是c
var s="abc_ab_abc";
/((..).)_\2_\1/.test(s); //其中\2代表的是ab \1代表的是abc
- 組匹配最大的應用就是用來匹配web標簽
var tag=/^<(\w+)>([^<]*)<\/\1>$/;
var match=tag.exec("<h1>我是頭標題</h1>") //["<h1>我是頭標題</h1>", "h1", "我是頭標題"]
var html = '<b class="hello">Hello</b><i>world</i>';
var tag = /<(\w+)([^>]*)>(.*)<\/\1>/g;
var match1=tag.exec(html); //["<b class="hello">Hello</b>", "b", " class="hello"", "Hello"]
var match2=tag.exec(html); //["<i>world</i>", "i", "", "world"]
7.組匹配的其他用法
- 非捕獲組 (?:x) 功能與普通的組匹配一樣,但是使用exec和字符串的match的時候不會返回組中的內容
var match1=/(?:.)b(.)/.exec("abc"); //["abc", "c"]
var match2="foolfool".match(/(?:foo)+(.)/); //["fool", "l"]
- 先行斷言x(?=y ) 就是x必須是在y的前面 y不會返回
/\d+(?=%)/.exec("99%"); //["99"]
- 先行否定斷言x(?!y) 就是x不能在y的前面 也不會返回
/\d+(?![.])/.exec(3.14); //[14]