095_RegExp对象
1. RegExp對象
1.1. RegExp對象表示正則表達式, 它是對字符串執行模式匹配的強大工具。
1.2. 字面量語法
/pattern/attributes;1.3. 創建RegExp對象的語法:
new RegExp(pattern, attributes);1.4. 參數
1.4.1. 參數pattern是一個字符串或正則表達式。
1.4.2. 參數attributes是一個可選的字符串, 包含屬性"g"、"i"和"m", 分別用于指定全局匹配、區分大小寫的匹配和多行匹配。ECMAScript標準化之前, 不支持m屬性。如果pattern是包含修飾符的正則表達式, 則必須省略該參數。
1.5. 返回值
1.5.1. 一個新的RegExp對象, 具有指定的模式和標志。如果參數pattern是正則表達式而不是字符串, 那么RegExp()構造函數將用與指定的RegExp相同的模式和標志創建一個新的RegExp對象。
1.5.2. 如果不用new運算符, 而將RegExp()作為函數調用, 那么它的行為與用new運算符調用時一樣, 只是當pattern是正則表達式時, 它只返回pattern, 而不再創建一個新的RegExp對象。
1.6. 盡管可以使用RegExp構造函數創建正則表達式, 但最好不要使用它, 因為使用構造函數比字面量創建正則表達式要慢得多。
2. RegExp對象屬性
3. RegExp對象方法
4. test()方法
4.1. test()方法用于檢測一個字符串是否匹配某個模式。
4.2. 語法
regExpObject.test(string)4.3. 參數
4.4. 返回值
4.4.1. 如果字符串string中含有與RegExpObject匹配的文本, 則返回true, 否則返回false。
5. exec()方法
5.1. exec()方法用于檢索字符串中的正則表達式的匹配。
5.2. 語法
regExpObject.exec(string)5.3. 參數
5.4. 返回值
5.4.1. 返回一個數組, 其中存放匹配的結果。如果未找到匹配, 則返回值為null。
5.5. 如果exec()找到了匹配的文本, 則返回一個結果數組。否則, 返回null。此數組的第0個元素是與正則表達式相匹配的文本, 第1個元素是與RegExpObject的第1個子表達式相匹配的文本(如果有的話), 第2個元素是與RegExpObject的第2個子表達式相匹配的文本(如果有的話), 以此類推。除了數組元素和length屬性之外, exec()方法還返回兩個屬性。index 屬性聲明的是匹配文本的第一個字符的位置。input屬性則存放的是被檢索的字符串string。我們可以看得出, 在調用非全局的RegExp對象的exec()方法時, 返回的數組與調用方法String.match() 返回的數組是相同的。
5.6. 但是, 當RegExpObject是一個全局正則表達式時, exec()的行為就稍微復雜一些。它會在RegExpObject的lastIndex屬性指定的字符處開始檢索字符串string。當exec()找到了與表達式相匹配的文本時, 在匹配后, 它將把RegExpObject的lastIndex屬性設置為匹配文本的最后一個字符的下一個位置。這就是說, 您可以通過反復調用exec() 方法來遍歷字符串中的所有匹配文本。當exec()再也找不到匹配的文本時, 它將返回null, 并把lastIndex屬性重置為0。
5.7. 如果在一個字符串中完成了一次模式匹配之后要開始檢索新的字符串, 就必須手動地把lastIndex屬性重置為0。
5.8. 請注意, 無論RegExpObject是否是全局模式, exec()都會把完整的細節添加到它返回的數組中。這就是exec()與String.match()的不同之處, 后者在全局模式下返回的信息要少得多。因此我們可以這么說, 在循環中反復地調用exec()方法是唯一一種獲得全局模式的完整模式匹配信息的方法。
6. 例子
6.1. 代碼
<!DOCTYPE html> <html><head><meta charset="utf-8" /><title>RegExp對象</title></head><body><script type="text/javascript">var re1 = new RegExp(/\s/);var r1 = re1.test('1\v2');document.write('\\s匹配垂直制表符: ' + r1 + ', global = ' + re1.global + ', ignoreCase = ' + re1.ignoreCase + ', multiline = ' + re1.multiline + ', source = ' + re1.source + '<br />');var re2 = new RegExp(/\s/i);var r2 = re2.test('1\f2');document.write('\\s匹配換頁符: ' + r2 + ', global = ' + re2.global + ', ignoreCase = ' + re2.ignoreCase + ', multiline = ' + re2.multiline + ', source = ' + re2.source + '<br />');var re3 = new RegExp(/\s/g);var r3 = re3.test('1\t2');document.write('\\s匹配制表符: ' + r3 + ', global = ' + re3.global + ', ignoreCase = ' + re3.ignoreCase + ', multiline = ' + re3.multiline + ', lastIndex = ' + re3.lastIndex + ', source = ' + re3.source + '<br />');var re4 = new RegExp(/\s/m);var r4 = re4.test('1\r2');document.write('\\s匹配回車符: ' + r4 + ', global = ' + re4.global + ', ignoreCase = ' + re4.ignoreCase + ', multiline = ' + re4.multiline + ', source = ' + re4.source + '<br />');var re5 = new RegExp(/\s/, 'i');var r5 = re5.test('1\n2');document.write('\\s匹配換行符: ' + r5 + ', global = ' + re5.global + ', ignoreCase = ' + re5.ignoreCase + ', multiline = ' + re5.multiline + ', source = ' + re5.source + '<br />');var re6 = new RegExp(/\s/, 'g');var r6 = re6.test('1 2');document.write('\\s匹配空格: ' + r6 + ', global = ' + re6.global + ', ignoreCase = ' + re6.ignoreCase + ', multiline = ' + re6.multiline + ', lastIndex = ' + re6.lastIndex + ', source = ' + re6.source + '<br />');var re7 = new RegExp(/\s/, 'm');var r7 = re7.test('1 2');document.write('\\s匹配tab鍵: ' + r7 + ', global = ' + re7.global + ', ignoreCase = ' + re7.ignoreCase + ', multiline = ' + re7.multiline + ', source = ' + re7.source + '<hr />');var str1 = 'Ruan jian bao dian wang fu wu yu 100 duo suo gao xiao, 200000 duo wan de gao xiao xue sheng he lao shi, yi gong you 30 duo wan yong hu le。';var result = null;var m1 = str1.match(/\d+/);document.write('匹配結果: ' + m1 + ', 匹配位置: ' + m1.index + ', 原字符串: ' + m1.input + '<br />');var mre1 = new RegExp(/\d+/, 'g')var m2 = str1.match(mre1);document.write('匹配結果: ' + m2 + ', global = ' + mre1.global + ', ignoreCase = ' + mre1.ignoreCase + ', multiline = ' + mre1.multiline + ', source = ' + mre1.source + '<hr />');// 只有new RegExp()返回的對象, 執行檢測后才有global, ignoreCase, multiline屬性var e1 = /\d+/.exec(str1);document.write('匹配結果: ' + e1 + ', 匹配位置: ' + e1.index + ', 原字符串: ' + e1.input + '<br />');var e2 = /\d+/g.exec(str1);document.write('匹配結果: ' + e2 + ', 匹配位置: ' + e2.index + ', 原字符串: ' + e2.input + '<hr />');// 全局匹配使用exec()方法, 循環調用打印所有匹配結果。var ere1 = new RegExp(/\d+/, 'g')while((result = ere1.exec(str1)) != null) {document.write('匹配結果: ' + result + ', 匹配位置: ' + result.index + ', 原字符串: ' + result.input + ', 下一次開始匹配的位置: ' + ere1.lastIndex + '<br />');}var sre1 = new RegExp('ruan jian', 'igm');var s1 = 'Ruan jian bao dian, ruan jian ke ji'.match(sre1);document.write('<hr />匹配結果: ' + s1 + ', global = ' + sre1.global + ', ignoreCase = ' + sre1.ignoreCase + ', multiline = ' + sre1.multiline + ', source = ' + sre1.source);</script></body> </html>6.2. 效果圖
總結
以上是生活随笔為你收集整理的095_RegExp对象的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 094_正则表达式
- 下一篇: 062_JavaScript异常
