1.創(chuàng)建正則表達(dá)式的方法
1.1創(chuàng)建正則表達(dá)式的兩種方法
-
構(gòu)造函數(shù)
- var regex=new RegExp(正則表達(dá)式[,匹配模式]);
-
字面量
- var regex = /正則表達(dá)式/;
1.2使用正則表達(dá)式進(jìn)行匹配
正則對(duì)象.test( 字符串 ) -> bool
如果參數(shù)字符串中含有 復(fù)合 正則匹配的 子字符串, 就返回 true, 否則返回 false
代碼演示:
// 查詢一段文字中是否包含 itcast
// 0123456789012345678901
var str = 'qwertyuiopasdfghjklxcitcastvbnm,wertyuioqwsdfgbhnjmzxcfvghjuiko';
// 要找 itcast, 因此正則表達(dá)式就可以使用 'itcast' 來表示
// 1, 創(chuàng)建正則表達(dá)式對(duì)象
var r1 = new RegExp( 'itcast' );
var r2 = /itcast/;
// 2, 開始檢查匹配
var res = r2.test( str );
console.log( res );
// 使用傳統(tǒng)字符串操作
var search = 'itcast'
for ( var i = 0; i < str.length - search.length; i++ ) {
// 判斷 str[ i ] 開始 的字符串是 itcast
if ( search == str.substr( i, search.length ) ) {
console.log( i );
break;
}
}
1.3元字符
1. . 查找單個(gè)字符,(除了換行和行結(jié)束符)
2. () 分組和提高優(yōu)先級(jí)
3. [] 表示一個(gè)字符
用法:[abc]出現(xiàn)[]中任意一個(gè)字符
可以匹配 a, b, c
4. | (或) 或的功能 優(yōu)先級(jí)最低
-----------------------------------------------
擴(kuò)展:
. 任意的一個(gè)字符银萍,沒有任何限制
[] 是出現(xiàn)在[]中的一個(gè)字符絮供。 認(rèn)為 . 的限制級(jí)版本
[abc]: a,b,或c
| 可以認(rèn)為是允許使用多個(gè)字符的匹配
5.轉(zhuǎn)義字符:\
表示點(diǎn): \.
表示[]: \[ \]
表示(): \( \)
表示\: \\
5.限定元字符
* 緊跟前面的一個(gè)字符或一組字符出現(xiàn)0次到多次
+ 緊跟在前面的字符出現(xiàn)1次到多次
东囚? 緊跟在前面的字符出現(xiàn) 0次 或者 1次
{數(shù)字} 緊跟在前面字符的出現(xiàn)指定次數(shù)
{數(shù)字,} 緊跟在前面的字符至少出現(xiàn)的字符
{數(shù)字椅野,數(shù)字} 緊跟在前面的字符出現(xiàn)的次數(shù)范圍幻捏。
1.4首尾正則表達(dá)式
^ 表示必須以 xxx 開頭
$ 表示必須以 xxx 結(jié)尾
^a 表示以a開頭的字符串
b$ 表示以b結(jié)尾的字符串
1.5簡寫元字符
\s 空白字符,包括空格肚邢,tab,回車換行等
\S 非空白字符
js中常使用[\s\S]表示任意字符
\w 表示字符,包含數(shù)字拭卿,字母骡湖,下劃線
\W 非字符
\d 代表數(shù)字
\D 非數(shù)字
1.6 exec 提取
使用正則表達(dá)式進(jìn)行匹配,使用exec 可以將匹配到的數(shù)據(jù)提取出來峻厚。
語法:
正則表達(dá)式 exp.exec(字符串)--> 封裝成數(shù)組
返回值:匹配到的表達(dá)式响蕴, 匹配子項(xiàng)
// 案例: 在 'abc123def456ghij789klum' 提取數(shù)字
var str = 'abc123def456ghij789klum';
// 1> 全局模式
var r = /\d+/g;
// 2> 匹配要使用循環(huán)的方式
var res;
//可以循環(huán)匹配出所有的匹配項(xiàng)。
while ( res = r.exec( str ) ) {
console.log( res );
}
注意:可以 (:惠桃?) 不捕獲子項(xiàng)浦夷。
1.7 反向引用
2> 與之匹配的標(biāo)簽名是什么?(反向引用)
如果在一個(gè)正則表達(dá)式中使用組匹配到某一個(gè)數(shù)據(jù), 允許在該正則表達(dá)式中使用
'\數(shù)字' 的方式引用該組
<(\w+)>.*<\/\1>
1.8 貪婪模式
凡是在正則表達(dá)式中, 涉及到次數(shù)限定的, 一般默認(rèn)都是盡可能的多匹配.
取消貪婪模式. 在次數(shù)限定符后面加上 ?
注意: 貪婪模式性能會(huì)略高于非貪婪模式, 所以開發(fā)的時(shí)候. 一般不考慮貪婪的問題
只有代碼匹配結(jié)果出現(xiàn)問題了, 一般一次多匹配了, 才會(huì)取消貪婪辖试。
1.9 否定元字符
[^abc] 表示匹配除了a,b,c以外的字符。
1.10 replace方法
字符串.replace( 正則表達(dá)式, 字符串 ) -> 字符串
1. 簡單替換
'aaaaa-------bbbbbb------ccccc'.replace( /-+/, '-' )
'aaaaa-------bbbbbb------ccccc'.replace( /-+/g, '-' )
2. 分組替換
可以在替換字符串中, 使用 $數(shù)字 來引用替換的數(shù)據(jù)
'abc123'.replace( /(\d+)/, 'd$1' ) -> 'abcd123'
'1991-1-1'
中國: 1991年1月1日
歐洲: 1/1/1991
... : 1991 1 1
'1991-1-19'.replace( /(\d+)-(\d+)-(\d+)/, '$1年$2月$3日' )
3> 函數(shù)參數(shù)用法(了解)
語法:
字符串.replace( 正則表達(dá)式, fn )
'我的郵箱是:abc@itcast.cn, 你的郵箱是: defghijk@itcast.cn'
.replace( /\w+@\w+(\.\w+)+/g, '*' );
'我的郵箱是:abc@itcast.cn, 你的郵箱是: def@itcast.cn'
.replace( /(\w+)@(\w+(\.\w+)+)/g, function ( s, g1, g2, g3 ) {
return '*';
} );
// 要求 只顯示 第一個(gè)字符, 其余的都是用 * 表示
'我的郵箱是:abc@itcast.cn, 你的郵箱是: defghijklim@itcast.cn'
.replace( /(\w+)@(\w+(\.\w+)+)/g, function ( s, g1, g2, g3 ) {
// 將用戶名 變成 a***** 的形式
var first = g1.charAt( 0 );
var start = [];
for ( var i = 0; i < g1.length - 1; i++ ) {
start.push( '*' );
}
return first + start.join('') + '@' + g2;
} );