Regular Expression是一個描述符合匹配條件的字符串的字符串,在js中有對應的RegExp對象來存儲正則表達式。
在js中實例化RegExp對象有兩種方法:
? 1.用字面量的形式? var reg=/ \b searchword \b /g,即/要匹配字符/+修飾符
? 其中,/…/表明內容是正則表達式,\b代表單詞邊界word boundary,g代表全局搜索global,為了方便觀看在各符號之間加了空格,實際代碼中只能寫成/\bsearchword\b/
? 2.使用構造函數? var reg=new RegExp(\bsearchword\b,g),即RegExp(表達式,修飾符)
RegExp對象的語法:
修飾符
? g? ? global——執行全局匹配,如果不加則會在匹配到第一個符合條件的字符/字符串時停止繼續替換
? i? ? ignoreCase——忽略大小寫
? m? multiline——執行多行匹配(忽略\r\n)
? 用法:加在/…/之后
元字符
? 元字符是指含有特殊含義的字符,通常由轉義符\+字母表示或者 * + ? $ ^ ...等符號來表示
? \+字母類:
? \w? word單詞字符,可以匹配a-z、A-Z、0-9、_下劃線
? \d? digital數字,可以匹配0-9
? \b? boundary邊界,匹配單詞邊界
? 例:"This is a boy".replace(/is/,IS)→ThIS IS a boy,而"This is a boy".replace(/\bis\b/,IS)→This IS a boy。
? \s? 空白字符,可以匹配空格字符及其他空白字符如回車\r、換行\r、制表\t
? \t? table水平制表
? \v? vertical垂直制表
? \r? carriage return移動光標到當前行的最左邊
? \n? new line移動光標到下一行,不會產生左右移動
? 關于回車與\r、\n的關系:
? 由上圖可知,在Win系統下瀏覽器解析文件中的回車鍵Enter=\r\n,即先光標左移后光標下移。
? 在Linux下Enter=\n,在Mac下Enter=\r。
? \0 空字符,匹配null
? \f 換頁符
? \cX? 匹配ctrl+X
↑注意在' '中反斜杠要生效需要經過轉義所以是\\b,使用/ /則無需轉義
符號類元字符(不全):
? . 表示除了\r、\n之外的任意字符
? ^表示取反
? 補充一點,\d表示匹配0-9的數字,只需將其大寫為\D則表示匹配所有不是數字的字符,\w、\s等以此類推
? ?? 表示出現0次或1次
? +? 表示出現1次或多次
? *? 表示出現0次或多次
? $? 與()搭配使用表示反引用,當然還有其他作用
? ( )? 表示分組
? { }? 表示量詞
? [ ]? 表示范圍
方括號[ ]
[ ]在正則表達式中我喜歡將其解釋成集合。
[0-9]、[a-z]、[a-zA-Z]即為匹配這個范圍內的數字,注意第三種寫法,在[ ]可以這樣連寫
[abc]為在字符串中匹配a或b或c字母其中的一個,注意并不是匹配abc
[^abc]為在字符串中匹配除了a、b、c以外的所有字符
量詞{ }
在字符串替換中,如出現對多個相同類型的字符進行替換,可以用量詞來簡化表達式。
{n}? 表示出現n次? /\d{3}/ = /\d\d\d/,匹配3個數字,\d=[0-9]
{n,m}? 表示出現n~m次? /\d{3,6}/,匹配3-6個數字
? ? 對于{n,m}存在貪婪和非貪婪兩種模式,在貪婪模式下會盡可能多的匹配,如對字符串“abc1234567def”進行(/\d{3,6}/,0)的替換結果是abc07def。而在非貪婪模式下(/\d{3,6?}/,? 0)的替換結果是abc04567def,會盡可能少的匹配。非貪婪模式表達方式為{n,m?}。
{n,}? 表示至少出現n次
?? 表示出現0次或1次? ? /bo?y/表示可以匹配by、boy
+? 表示出現1次或多次? /bo+y/表示可以匹配boy、boooy、boooooooy等
*? 表示出現0次或多次? /bo*y/表示可以匹配by、boy、boooooy等
? 注意:{n}、?等只作用于緊挨著的前一個字符,即/bo{3}y/=boooy,/bo+y/=boy、booooy。。。
↑通過https://regexper.com/提供的可視化解釋可以幫助我們理解正則表達式
分組( )
使用()可以使量詞對多個字符生效,如/(abc){3}/ 就相當于"abcabcabc"
使用()可以捕獲匹配到的內容,并通過$+數字進行反引用
? 如我們要將2017-10-1替換為10/1/2017:
因為日期是變量,所以這里使用+量詞而不使用{4}、{2}、{2}
如果我們要禁止()捕獲內容,要這樣書寫(?:+表達式),如(?:\d{4})
前瞻
js讀取文本時的順序是從前向后,這里的前瞻是指匹配了對應內容的字符但還要繼續向后看,檢查后面字符是否符合額外的條件,然后進行替換,替換內容不包括前瞻內容。
? 前瞻的表達方法為:/表達式(?=額外的表達式條件)/
? 下例為將4個字母后還帶有3個數字的4個字母進行替換
令人傷心的是js并不支持后顧,也就是說如我想單獨的替換"@123@456@"中"3@4"中的"@4"將無法實現,因為@1和@4將沒有辦法區分。
RegExp對象的屬性與方法
RegExp對象的屬性
global、ignorecase、multiline? 文章開頭已說過
lastIndex? 如果啟用了全局搜索g,則會在每一次匹配后獲得匹配成功的內容中最后一個字符的下一個字符的位置,需要搭配RegExp對象的test()方法使用。
source? 返回正則表達式的文本內容
RegExp對象的方法
test()
檢測字符串中是否存在符合正則表達式的字符串,有則返回ture,沒有則返回false
用法:RegExpObject.test(stringObject)
匹配成功后會更改RegExp中的lastIndex屬性,如果啟用了g選項的話,lastIndex為當前匹配成功的字符串中最后一個字符的下一個字符的位置
exec()
檢測字符串中是否存在符合正則表達式的字符串,如果有則返回一個字符串數組,數組的內容是匹配的字符串,數組有額外2個屬性index和input,index存放上次匹配成功的字符串內容的第一個字符所在的位置,input存放原檢索字符串的引用,沒有則返回null。
用法同上
string對象的方法
string對象的方法配合正則表達式使用方法為:stringObject.function(RegExpObject)
search()? 并不執行全局匹配/查找。 "123abc3a".search(/3a/g) 返回index(查找成功的第一個字符串內容中第一個字符的位置),如果查找失敗返回-1
match() 尋找1個以上與正則表達式匹配的字符串內容。
? 在非g情況下,執行后返回字符串數組,第一個元素存放的是匹配的字符串內容;第二~第n存放匹配子表達式的字符串內容,比如使用了()分組,則()內與表達式 符合的字符串內容將依次存放進第二~第n個元素中。返回的數組還包括2個屬性,index存放匹配文本的首字符在原字符串中的位置;input存放對原字符串對象的引用。
? 在帶g模式下,match()返回字符串數組,有n個元素,存放匹配成功的n個字符串,不會存放()符合分組表達式的字符串內容,數組沒有index、input屬性。
replace()? 把字符串中符合條件的內容替換
用法stringObject.replace(RegExpObject,stringObject)這個很簡單不再解釋
或stringObject.replace(RegExpObject,function())
對于function()如果設置了形參,則會默認依次傳遞以下參數:
1.匹配字符串
2.正則表達式分組內容(),如果沒有分組則跳過
3.匹配項在原字符串中的index
4.原字符串
下例將"a1b2c3d4e55f666g7"中的數字字符全部替換為自身+1
當reg為g模式時,replace函數會循環調用自身
split()? 用于把一個字符串分割成字符串數組
用法:stringObject.split(RegExp),將RegExp作為分隔符分割字符串,當然也可以使用字符做分隔符,使用""做分隔符時,會將字符串的每個字符分割開。
小結:
js中正則表達式的學習就到此為止了,要掌握好正則表達式主要是對語法規則有深入的了解。原來的string對象的replace()、search()、match()等方法可以傳入string對象,但實質都是轉換為正則表達式。string對象的方法不會修改原對象的值。