亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

javascript類型系統_正則表達式RegExp類型詳解

2019-11-20 09:36:50
字體:
來源:轉載
供稿:網友

前面的話

前面已經介紹過javascript中正則表達式的基礎語法。javascript的RegExp類表示正則表達式,String和RegExp都定義了方法,使用正則表達式可以進行強大的模式匹配和文本檢索與替換。本文將介紹正則表達式的RegExp對象,以及正則表達式涉及
到的屬性和方法

對象

javascript中的正則表達式用RegExp對象表示,有兩種寫法:一種是字面量寫法;另一種是構造函數寫法

Perl寫法

正則表達式字面量寫法,又叫Perl寫法,因為javascript的正則表達式特性借鑒自Perl

正則表達式字面量定義為包含在一對斜杠(/)之間的字符,并且可以設置3個標志

var expression = /pattern/flags;

正則表達式的匹配模式支持下列3個標志:

g: 表示全局(global)模式,即模式將被應用于所有字符串,而非在發現第一個匹配項時立即停止

i: 表示不區分大小寫(case-insensitive)模式,即在確定匹配項時忽略模式與字符串的大小寫

m: 表示多行(multiline)模式,即在到達一行文本末尾時還會繼續查找下一行中是否存在與模式匹配的項

//匹配字符串所有'at'的實例var p = /at/g;//test()方法返回一個布爾值表示是否可以找到匹配項console.log(p.test('ata'));//trueconsole.log(p.test('aba'));//false

RegExp構造函數

和普通的內置對象一樣,RegExp正則表達式對象也支持new+RegExp()構造函數的形式

RegExp構造函數接收兩個參數:要匹配的字符串模式(pattern)和可選的標志字符串(flags),標志字符串和字面量的三個標志含義相同:'g'、'i'、'm'

RegExp構造函數的兩個參數都是字符串。且使用字面量形式定義的任何表達式都可使用構造函數

//匹配字符串所有'at'的實例var p1 = /at/g;//同上var p2 = new RegExp('at','g');

[注意]ECMAScript3規范規定,一個正則表達式直接量會在執行到它時轉換為一個RegExp對象,同一段代碼所表示正則表達式直接量的每次運算都返回同一個對象。ECMAScript5規范則做了相反的規定,同一段代碼所表示的正則表達式直接量的每次

運算都返回新對象。IE6-8一直是按照ECMAScript5規范的方式實現的,所以并沒有兼容性問題

由于正則表達式字面量并不支持變量,所以如果正則表達式中出現變量只能使用RegExp構造函數以字符串拼接的形式,將變量拼接到RegExp構造函數的參數中

【tips】通過類名classname獲取元素

function getByClass(obj,classname){  var elements = obj.getElementsByTagName('*');  var result = [];  var pattern = new RegExp( '(^|//s)'+ classname + '(//s|$)');  for(var i = 0; i < elements.length; i++){    if(pattern.test(elements[i].className)){      result.push(elements[i]);    }  }  return result;}

實例屬性

每個RegExp實例對象都包含如下5個屬性

global:    布爾值,表示是否設置了g標志ignoreCase: 布爾值,表示是否設置了i標志lastIndex:  整數,表示開始搜索下一個匹配項的字符位置,從0算起multiline:  布爾值,表示是否設置了標志msource:    正則表達式的字符串表示,按照字面量形式而非傳入構造函數中的字符串模式返回
var pattern = new RegExp('//[bc//]at','i');console.log(pattern.global);//falseconsole.log(pattern.ignoreCase);//true  console.log(pattern.multiline);//falseconsole.log(pattern.lastIndex);//0console.log(pattern.source);//'/[bc/]at'

如果使用RegExp的exec()或test()函數,并且設定了全局模式'g',正則表達式的匹配就會從lastIndex的位置開始,并且在每欠匹配成功之后重新設定lastIndex。這樣,就可以在字符串中重復迭代,依次尋找各個匹配結果。但是,如果需要對不同字符串調用同一個RegExp的exec()或test()方法,這個變量也也可能會帶來意料之外的匹配結果,所以在更換字符串時,要顯式地將RegExp的lastIndex置為0

//exec()方法以數組形式返回匹配項var p = //w/g;var s = 'ab';console.log(p.lastIndex);//0console.log(p.exec(s));//['a']console.log(p.lastIndex);//1console.log(p.exec(s));//['b']console.log(p.lastIndex);//2console.log(p.exec(s));//nullconsole.log(p.lastIndex);//0
var p = //w/g;var s1 = 'ab';var s2 = 'ba';console.log(p.lastIndex);//0console.log(p.exec(s1));//['a']console.log(p.lastIndex);//1console.log(p.exec(s2));//['a']console.log(p.lastIndex);//2

構造函數屬性

RegExp構造函數屬性被看成靜態屬性,這些屬性基于所執行的最近一次正則表達式操作而變化

有兩種方式訪問它們,即長屬性名和短屬性名。短屬性名大都不是有效的ECMAScript標識符,所以必須通過方括號語法來訪問它們

長屬性名    短屬性名           說明input       $_        最近一次要匹配的字符串lastMatch     $&        最近一次的匹配項lastParen     $+        最近一次匹配的捕獲組leftContext    $`        input字符串中lastMatch之前的文本multiline     $*        布爾值,表示是否所有表達式都使用多行模式rightContext   $'        Input字符串中lastMarch之后的文本

使用這些屬性,可以從exec()方法或test()方法執行的操作中提取出更具體的信息

//test()用于測試一個字符串是否匹配某個正則表達式,并返回一個布爾值var text = 'this has been a short summer';var pattern = /(.)hort/g;if(pattern.test(text)){  console.log(RegExp.input);//'this has been a short summer'  console.log(RegExp.leftContext);//'this has been a '  console.log(RegExp.rightContext);//' summer'  console.log(RegExp.lastMatch);//'short'  console.log(RegExp.lastParen);//'s'  console.log(RegExp.multiline);//false  console.log(RegExp['$_']);//'this has been a short summer'  console.log(RegExp['$`']);//'this has been a '  console.log(RegExp["$'"]);//' summer'  console.log(RegExp['$&']);//'short'  console.log(RegExp['$+']);//'s'  console.log(RegExp['$*']);//false    }

javascript有9個用于存儲捕獲組的構造函數屬性,在調用exec()或test()方法時,這些屬性會被自動填充

[注意] 理論上,應該保存整個表達式匹配文本的RegExp.$0并不存在,值為undefined

//RegExp.$1/RegExp.$2/RegExp.$3……到RegExp.$9分別用于存儲第一、第二……第九個匹配的捕獲組var text = 'this has been a short summer';var pattern = /(..)or(.)/g;if(pattern.test(text)){  console.log(RegExp.$1);//sh  console.log(RegExp.$2);//t}

實例方法 

RegExp對象的實例方法共5個,分為兩類。包括toString()、toLocalString()、valueOf()這3種對象通用方法和test()、exec()正則匹配方法

對象通用方法

RegExp對象繼承了Object對象的通用方法toString()、toLocaleString()、valueOf()這三個方法

【toString()】

toString()方法返回正則表達式的字面量

【toLocaleString()】

toLocaleString()方法返回正則表達式的字面量

【valueOf()】

valueOf()方法返回返回正則表達式對象本身

[注意]不論正則表達式的創建方式是哪種,這三個方法都只返回其字面量形式

var pattern = new RegExp('[bc]at','gi');console.log(pattern.toString()); // '/[bc]at/gi'console.log(pattern.toLocaleString()); // '/[bc]at/gi'console.log(pattern.valueOf()); // /[bc]at/givar pattern = /[bc]at/gi;console.log(pattern.toString()); // '/[bc]at/gi'console.log(pattern.toLocaleString()); // '[bc]at/gi'console.log(pattern.valueOf()); // /[bc]at/gi

正則匹配方法

正則表達式RegExp對象的正則匹配方法只有兩個:分別是exec()和test()

【exec()】

exec()方法專門為捕獲組而設計,接受一個參數,即要應用模式的字符串。然后返回包含匹配項信息的數組,在沒有匹配項的情況下返回null

在匹配項數組中,第一項是與整個模式匹配的字符串,其他項是與模式中的捕獲組匹配的字符串,如果模式中沒有捕獲組,則該數組只包含一項

返回的數組包含兩個額外的屬性:index和input。index表示匹配項在字符串的位置,input表示應用正則表達式的字符串

var text = 'mom and dad and baby and others';var pattern = /mom( and dad( and baby)?)?/gi;var matches = pattern.exec(text);console.log(pattern,matches);//pattern.lastIndex:20//matches[0]:'mom and dad and baby'//matches[1]:' and dad and baby'//matches[2]:' and baby'//matches.index:0//matches.input:'mom and dad and baby and others'

對于exec()方法而言,即使在模式中設置了全局標志(g),它每次也只會返回一個匹配項。在不設置全局標志的情況下,在同一個字符串上多次調用exec(),將始終返回第一個匹配項的信息;而在設置全局標志的情況下,每次調用exec()都會在字符串中繼續查找新匹配項

var text = 'cat,bat,sat,fat';var pattern1 = /.at/;var matches = pattern1.exec(text);console.log(pattern1,matches);//pattern1.lastIndex:0//matches[0]:'cat'//matches.index:0//matches.input:'cat,bat,sat,fat'var text = 'cat,bat,sat,fat';matches = pattern1.exec(text);  console.log(pattern1,matches);  //pattern1.lastIndex:0//matches[0]:'cat'//matches.index:0//matches.input:'cat,bat,sat,fat'
var text = 'cat,bat,sat,fat';var pattern2 = /.at/g;var matches = pattern2.exec(text);console.log(pattern2,matches);  //pattern2.lastIndex:3//matches[0]:'cat'//matches.index:0//matches.input:'cat,bat,sat,fat'var text = 'cat,bat,sat,fat';matches = pattern2.exec(text);console.log(pattern2,matches);  //pattern2.lastIndex:7//matches[0]:'bat'//matches.index:4//matches.input:'cat,bat,sat,fat'

【tips】用exec()方法找出匹配的所有位置和所有值

var string = 'j1h342jg24g234j 3g24j1';var pattern = //d/g;var valueArray = [];//值var indexArray = [];//位置var temp;while((temp=pattern.exec(string)) != null){  valueArray.push(temp[0]);  indexArray.push(temp.index); }//["1", "3", "4", "2", "2", "4", "2", "3", "4", "3", "2", "4", "1"] [1, 3, 4, 5, 8, 9, 11, 12, 13, 16, 18, 19, 21]console.log(valueArray,indexArray);

【test()】

test()方法用來測試正則表達式能否在字符串中找到匹配文本,接收一個字符串參數,匹配時返回true,否則返回false

var text = '000-00-000';var pattern = //d{3}-/d{2}-/d{4}/;if(pattern.test(text)){  console.log('The pattern was matched');}

同樣地,在調用test()方法時,會造成RegExp對象的lastIndex屬性的變化。如果指定了全局模式,每次執行test()方法時,都會從字符串中的lastIndex偏移值開始嘗試匹配,所以用同一個RegExp多次驗證不同字符串,必須在每次調用之后,將lastIndex值置為0

var pattern = /^/d{4}-/d{2}-/d{2}$/g;console.log(pattern.test('2016-06-23'));//trueconsole.log(pattern.test('2016-06-23'));//false//正確的做法應該是在驗證不同字符串前,先將lastIndex重置為0var pattern = /^/d{4}-/d{2}-/d{2}$/g;console.log(pattern.test('2016-06-23'));//truepattern.lastIndex = 0;console.log(pattern.test('2016-06-23'));//true

前面介紹過,javascript有9個用于存儲捕獲組的構造函數屬性,在調用exec()或test()方法時,這些屬性會被自動填充

[注意]理論上,應該保存整個表達式匹配文本的RegExp.$0并不存在,值為undefined

if(/^(/d{4})-(/d{2})-(/d{2})$/.test('2016-06-23')){  console.log(RegExp.$1);//'2016'  console.log(RegExp.$2);//'06'  console.log(RegExp.$3);//'23'  console.log(RegExp.$0);//undefined}

以上就是小編為大家帶來的javascript類型系統_正則表達式RegExp類型詳解全部內容了,希望大家多多支持武林網~

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美人在线视频| 亚洲激情视频网站| 91亚洲精品视频| 国产成人91久久精品| 日韩高清电影好看的电视剧电影| 97国产精品久久| 国产精品免费观看在线| 国产一区二区三区高清在线观看| 亚洲精品mp4| 日韩资源在线观看| 日韩在线免费av| 亚洲欧美日韩精品久久奇米色影视| 国产亚洲欧美日韩精品| 欧美精品videosex牲欧美| 亚洲人成在线观| 久久这里只有精品视频首页| 国产精品久久久久aaaa九色| 亚洲精品短视频| 亚洲免费视频在线观看| 国产精品久久久久久久久| 国产日韩欧美视频| 九色精品免费永久在线| 欧美做受高潮电影o| 欧美日韩亚洲网| 成人黄色影片在线| 一区二区欧美久久| 日韩电影中文字幕av| 日韩精品黄色网| 国产精品久久久久不卡| 91国在线精品国内播放| 欧美一级淫片播放口| 亚洲jizzjizz日本少妇| 日韩av电影免费观看高清| 精品国模在线视频| 亚洲伊人第一页| 日韩精品免费视频| 97**国产露脸精品国产| 久久久www成人免费精品张筱雨| 琪琪亚洲精品午夜在线| 国产欧美精品一区二区三区介绍| 91美女片黄在线观看游戏| 日韩成人中文字幕| 久久精品青青大伊人av| 亚洲春色另类小说| 国产精品极品美女粉嫩高清在线| 亚洲色图激情小说| 亚洲伊人第一页| 亚洲视频欧美视频| 2019中文字幕全在线观看| 国产精品久久久久久久久久久久久久| 欧美国产欧美亚洲国产日韩mv天天看完整| 国产精品美女av| 亚洲欧美国产精品va在线观看| 国产裸体写真av一区二区| 国产一区二区三区在线视频| 在线看日韩欧美| 久久久久久香蕉网| 欧美另类69精品久久久久9999| 国语自产在线不卡| 亚洲一区中文字幕| 国内外成人免费激情在线视频网站| 久久精品中文字幕一区| 色天天综合狠狠色| 亚洲欧洲在线视频| 欧美性资源免费| 日韩在线中文视频| 欧美性高跟鞋xxxxhd| 亚洲性线免费观看视频成熟| 欧美另类第一页| 九九视频直播综合网| 国产精品久久久久久久美男| www.久久久久久.com| 91精品国产自产在线老师啪| 国产精品视频网站| 亚洲区在线播放| 国产精品pans私拍| 欧美精品免费看| 国产精品久久久久久久av电影| 国产欧美一区二区白浆黑人| 成人免费观看网址| 成人黄色在线播放| 日韩在线免费视频观看| 一区二区三区视频免费在线观看| 欧美性xxxx极品hd满灌| 疯狂做受xxxx高潮欧美日本| 久久久视频免费观看| 日韩免费观看av| 亚洲a一级视频| 久久精品91久久久久久再现| 久久国产精品久久精品| 国产精品精品国产| 国内成人精品视频| 亚洲久久久久久久久久久| 色妞在线综合亚洲欧美| 亚洲精品福利在线观看| 国产精品视频1区| 在线观看亚洲区| 亚洲激情视频在线观看| 亚洲女人被黑人巨大进入al| 日韩中文字幕在线视频播放| 国产精品成人久久久久| 亚洲美女精品成人在线视频| 国产成人在线亚洲欧美| 日本欧美在线视频| 国产亚洲精品高潮| 精品人伦一区二区三区蜜桃免费| 美女国内精品自产拍在线播放| 成人午夜小视频| 高跟丝袜欧美一区| 亚洲精品99久久久久中文字幕| 国产精品久久久久国产a级| 国产成人精品一区二区在线| 91精品国产自产在线老师啪| 亚洲欧美日韩网| 国产精品色视频| 国产精品专区h在线观看| 欧美精品国产精品日韩精品| 欧美激情亚洲自拍| 国产精品视频yy9099| 91久久久亚洲精品| 欧美肥臀大乳一区二区免费视频| 国产精品黄色av| 欧美成人精品一区二区三区| 欧美日韩成人精品| 国产精品免费视频久久久| 伊人久久男人天堂| 欧美丝袜一区二区| 尤物九九久久国产精品的分类| www日韩中文字幕在线看| 成人亚洲欧美一区二区三区| 亚洲欧美日韩区| 日韩美女激情视频| 国产欧美日韩专区发布| 欧美性色视频在线| 一区二区三区国产视频| 亚洲最大的av网站| 亚洲第一精品夜夜躁人人爽| 最近2019免费中文字幕视频三| 亚洲 日韩 国产第一| 亚洲一区久久久| 欧美成人免费观看| 日韩亚洲欧美成人| 亚洲精品v欧美精品v日韩精品| 一区二区在线视频播放| 亚洲综合中文字幕在线| 欧美极品在线播放| 91免费看片网站| 91精品久久久久久久久| 久久人人爽亚洲精品天堂| 国产精品电影久久久久电影网| 亚洲欧美日韩爽爽影院| 欧美性xxxxxxxxx| 日韩免费在线播放| 欧美大片va欧美在线播放| 久久久久久九九九| 国产精品福利在线观看网址| 亚洲精品v欧美精品v日韩精品| 国产成+人+综合+亚洲欧美丁香花| 日韩专区中文字幕| 最近2019年中文视频免费在线观看| 影音先锋欧美在线资源| 久久久久久久国产精品| 全亚洲最色的网站在线观看| 久久精品电影一区二区|