成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript 中的正則表達(dá)式

_Dreams / 3290人閱讀

摘要:正則表達(dá)式的意義中的正則表達(dá)式使用表示,可以使用構(gòu)造函數(shù)來創(chuàng)建對象,不過對象更多的是通過一種特殊的直接量語法來創(chuàng)建。用構(gòu)造函數(shù)也可以定義一個(gè)與之等價(jià)的正則表達(dá)式,代碼如下正則表達(dá)式的模式規(guī)則是由一個(gè)字符序列組成的。

正則表達(dá)式的模式匹配

正則表達(dá)式(regular expression)是一個(gè)描述字符模式的對象。javascript的RegExp對象表示正則表達(dá)式,StringRegExp都定義了方法,后者使用正則表達(dá)式進(jìn)行強(qiáng)大的模式匹配和文本檢索與替換功能。Javascript的正則表達(dá)式是Perl5的正則表達(dá)式語法的大型子集,所以對于有Perl編程經(jīng)驗(yàn)的程序員來說。學(xué)習(xí)Javascript的正則表達(dá)式是小菜一碟。

正則表達(dá)式的意義

Javascript中的正則表達(dá)式使用RegExp表示,可以使用RegExp()構(gòu)造函數(shù)來創(chuàng)建RegExp對象,不過RegExp對象更多的是通過一種特殊的直接量語法來創(chuàng)建。就像通過引號(hào)包裹字符的方式來創(chuàng)建字符串直接量一樣。正則表達(dá)式直接了定義為包含在一對斜杠(/)之間的字符,例如:

var patterns = /s$/;

運(yùn)行這段代碼創(chuàng)建一個(gè)新的RegExp對象,并將它賦值給變量patterns。這個(gè)特殊的RegExp對象用來匹配所有以字符“s”結(jié)尾的字符串。用構(gòu)造函數(shù)RegExp也可以定義一個(gè)與之等價(jià)的正則表達(dá)式,代碼如下:

var pattern = new RegExp("s$");

正則表達(dá)式的模式規(guī)則是由一個(gè)字符序列組成的。包括所有字母和數(shù)字在內(nèi),大多數(shù)的字符都是按照直接量僅描述匹配的字符的。如此說來,正則表達(dá)式/java/可以匹配任何包含“java”子串的字符串。除此之外,正則表達(dá)式中還有其他具有特殊語義的字符,這些字符并不按照字面含義進(jìn)行匹配。比如,正則表達(dá)式/s$/包含兩個(gè)字符,第一個(gè)字符“s”按照字面含義匹配,第二個(gè)字符“$”是一個(gè)具有特殊語義的字符,用以匹配字符串的結(jié)束。因此這個(gè)表達(dá)式可以匹配任何以“s”結(jié)束的字符串。

RegExp直接量和對象的創(chuàng)建

就像字符和數(shù)字一樣,程序中每個(gè)取值相同的原始類型直接量均表示相同的值,這是顯而易見的。程序運(yùn)行時(shí)每次遇到對象直接量(初始化表達(dá)式)諸如{}[]的時(shí)候都會(huì)創(chuàng)建新對象。比如,如果在循環(huán)體中寫var a = [];,則每次遍歷都會(huì)創(chuàng)建一個(gè)新的空數(shù)組。

正則表達(dá)式直接量則與此不同,ECMAScript 3規(guī)范規(guī)定,一個(gè)正則表達(dá)式直接量會(huì)在執(zhí)行到它時(shí)轉(zhuǎn)換為一個(gè)RegExp對象,同一段代碼所表示正則表達(dá)式直接量的每次運(yùn)算都返回同一個(gè)對象。ECMAScript 5規(guī)范則做了相反的規(guī)定,同一段代碼所表示的正則表達(dá)式直接量的每次運(yùn)算都返回新對象。IE一直都是按照ECMAScript 5的規(guī)范實(shí)現(xiàn)的,多數(shù)最新版本的瀏覽器也開始遵循ECMAScript 5,盡管目前該標(biāo)準(zhǔn)并為全面廣泛推行。如下列代碼:

function getReg() {
    var reg = /[a-z]/;
    reg.foo = "bar";
    return reg;
}
var reg = getReg();
var reg2 = getReg();
console.log(reg === reg2); // 在Firefox 3.6中返回true,在Firefox 4+中返回flase
reg.foo = "baz";
console.log(reg2.foo); // 在Firefox 3.6中返回“baz”,在Firefox 4+中返回“bar”

原因可以在ECMAScript 5規(guī)范第24頁和第247頁中找到,也就是說在ECMAScript 3規(guī)范中,用正則表達(dá)式創(chuàng)建的RegExp對象會(huì)共享一個(gè)實(shí)例,而在ECMAScript 5中則是兩個(gè)獨(dú)立的實(shí)例。很明顯ECMAScript 5的規(guī)范更符合開發(fā)者的期望。

直接量字符串

正如上文提到的,正則表達(dá)式中的所有字母和數(shù)字都是按照字面含義進(jìn)行匹配的。JavaScript正則表達(dá)式也支持非字母的字符匹配,這些字符通過反斜線()作為前綴進(jìn)行轉(zhuǎn)義。比如,轉(zhuǎn)義字符n用來匹配換行符。

o NUL字符(u0000)

t 制表符(u0009)

n 換行符(u000A)

v 垂直制表符(u000B)

f 換頁符(u000C)

r 回車符(u000D)

xnn 有十六進(jìn)制數(shù)nn指定為拉丁字符,例如,x0A等價(jià)于n

uxxxx 由十六進(jìn)制數(shù)xxxx指定的Unicode字符,例如u0009等價(jià)于t

cX 控制字符^X,例如,cJ等價(jià)于換行符n

在正則表達(dá)式中,許多(共18個(gè))標(biāo)點(diǎn)符號(hào)具有特殊含義,它們是

^ $ . * + ? : ! =  / | [ ] { } ( ) 

在接下來的幾節(jié)里,我們將學(xué)習(xí)這些符號(hào)的含義,某些符合只有在正則表達(dá)式的某些上下文中才具有特殊含義,在其他上下文中則被當(dāng)成直接量處理。然而,如果想在正則表達(dá)式中使用這些字符的直接量進(jìn)行匹配,則必須使用前綴``,這是一條通用的規(guī)則。其他標(biāo)點(diǎn)符號(hào)(比如@和引號(hào))沒有特殊含義,在正則表達(dá)式中按照字面含義進(jìn)行匹配。

如果不記得那些標(biāo)點(diǎn)符號(hào)需要反斜線轉(zhuǎn)移,可以使用每個(gè)標(biāo)點(diǎn)符號(hào)前都加上反斜線。另外需要注意,許多字符和數(shù)字在有反斜線做前綴是也有特殊含義`,所以對于想按照直接量進(jìn)行匹配的字母和數(shù)字,進(jìn)行不要用反斜線對其轉(zhuǎn)義。當(dāng)然,想要在正則表達(dá)式中按照直接量匹配反斜線本身,則必須使用反斜線將其轉(zhuǎn)義。比如,正則表達(dá)式“//”用以匹配任何包含反斜線的字符串。

字符類

直接量字符串多帶帶放進(jìn)方括號(hào)內(nèi)就組成了字符類(character class)。一個(gè)字符類可以匹配它所包含的任意字符。因此,正則表達(dá)式/[abc]/就和字母“a”、“b”、“c”中的任意一個(gè)都匹配。定義否定字符類時(shí),將一個(gè)“^”字符做為左方括號(hào)內(nèi)的第一字符。正則表達(dá)式/[^abc]/匹配的是“a”、“b”、“c”之外的所有字符。字符類可以使用連字符來表示字符范圍。要匹配拉丁字母表中的小寫字母,可以使用/[a-z]/,要匹配拉丁字母表中任何字母和數(shù)字,則使用/[a-zA-Z0-9]/。

由于某些字符類非常常用,因?yàn)樵贘avaScript的正則表達(dá)式語法中,使用了這些特殊字符的轉(zhuǎn)義字符來表示它們。例如,s匹配的是空格符、制表符和其他Unicode空白符(o、 、 、 v、 f、 等),S匹配的是非Unicode 空白符的字符。下面列出了這些字符,并且總結(jié)了字符類的語法(注意,有些字符類轉(zhuǎn)義字符只能匹配ASCII字符,還沒有擴(kuò)展到可以處理Unicode字符,但可以通過十六進(jìn)制表示方法來顯示定義Unicode字符類,例如,/[u2e80-u9fff]/用來匹配所有漢字)。

[...] 方括號(hào)內(nèi)的任意字符

[^...] 不在方括號(hào)內(nèi)的任意字符

. 除換行符和其他Unicode行終止符之外的任意字符

w 任何ASCII字符組成的單詞,等價(jià)于[a-zA-Z0-9]

W 任何不適ASCII字符組成的單詞,等價(jià)于[^a-zA-Z0-9]

s 任何Unicode空白符

S 任何非Unicode空白符的字符,注意W和S的不同

d 任何ASCII數(shù)字,等價(jià)于[0-9]

D 除了ASCII數(shù)字之外的任何字符,等價(jià)于[^0-9]

[b] 推格直接量(特例)

注意,在方括號(hào)之內(nèi)也可以寫這些特殊轉(zhuǎn)義字符。比如,由于s匹配所有的空白符,d匹配的是所有數(shù)字,因?yàn)?[ds]/匹配的就是任意空白符或者數(shù)字。注意,這里有一個(gè)特例。下面我們將會(huì)看到轉(zhuǎn)義符具有的特殊含義,當(dāng)用在字符類時(shí),它表示的是退格字符,所以要在正則表達(dá)式中按照直接量表示一個(gè)退格符,只需要使用具有一個(gè)元素的字符類/[]/。

重復(fù)

用剛剛學(xué)過的正則表達(dá)式的語法,可以把兩位數(shù)描述成/dd/,四位數(shù)描述成/ffffdd/。但是目前為止,還沒有一種方法可以用來描述任意多位的數(shù)字活著描述由三個(gè)字母和一個(gè)數(shù)字構(gòu)成的字符串。這些正則表達(dá)式語法中較為復(fù)雜的模式都提到了正則表達(dá)式中某元素的"重復(fù)出現(xiàn)次數(shù)"。

我們在正則模式之后跟隨用以制定字符重復(fù)的標(biāo)記。由于某些重復(fù)種類非常常用,因此就有一些專門用于表示這種情況的特殊字符。例如,“+”用以匹配前一個(gè)模式的一個(gè)或多個(gè)副本。下面總結(jié)了這些表示重復(fù)的正則語法。

{n,m} 匹配前一項(xiàng)至少n次,但不能超過m次

{n,} 匹配前一項(xiàng)n次或者更多次

{n} 匹配前一項(xiàng)n次

? 匹配前一項(xiàng)0次或者1次,也就是說前一項(xiàng)是可選的,等價(jià)于{0,1}

+ 匹配前一項(xiàng)1次或者多次,等價(jià)于{1,}

* 匹配前一項(xiàng)0次或者多次,等價(jià)于{0,}

這里有一些例子:

var reg1 = /d{2,4}/  // 匹配2~4個(gè)數(shù)字
var reg2 = /w{3}d?/  // 精確匹配三個(gè)單詞和一個(gè)可選數(shù)字
var reg3 = /s+javas+/  // 匹配前后帶有一個(gè)或多個(gè)空格的字符串“java”
var reg4 = /[^(]*/  // 匹配一個(gè)或多個(gè)非左括號(hào)的字符

在使用“*”和“?”時(shí)要注意,由于這些字符可能匹配0個(gè)字符,因此它們允許什么都不匹配。例如,正則表達(dá)式/a*/實(shí)際與字符串“bbbb”匹配,因?yàn)檫@個(gè)字符串含有0個(gè)a。

非貪婪的重復(fù)

上面列出的匹配重復(fù)字符是盡可能多的匹配,而且允許后續(xù)的正則表達(dá)式繼續(xù)匹配。因此,我們稱之為“貪婪的”匹配。我們同樣可以使用正則表達(dá)式進(jìn)行非貪婪匹配。只須在待匹配的字符后跟隨一個(gè)問號(hào)即可:“??”、“+?”、“*?”或“{1,5}?”。比如,正則表達(dá)式/a+/可以匹配一個(gè)或多個(gè)連續(xù)的字符a。當(dāng)使用“aaa”作為匹配字符串時(shí),正則表達(dá)式會(huì)匹配它的三個(gè)字符。但是/a+?/也可以匹配一個(gè)或多個(gè)連續(xù)字母a,但它是盡可能少地匹配。我們同樣將“aaa”作為匹配字符串,但后一個(gè)模式只能匹配第一個(gè)a。

使用非貪婪的匹配模式所得到的結(jié)果可能和期望并不一致??紤]以下正則表達(dá)式/a+b/,它可以匹配一個(gè)或多個(gè)a,以及一個(gè)b。當(dāng)使用“aaab”作為匹配字符串時(shí),她會(huì)匹配整個(gè)字符串,現(xiàn)在再試一下非貪婪匹配的版本/a+?b/,它匹配盡可能少的a和一個(gè)b。當(dāng)用它來匹配“aaab”時(shí),你期望它能匹配一個(gè)a和最后一個(gè)b。但實(shí)際上,這個(gè)模式卻匹配了整個(gè)字符串,和該模式的貪婪匹配一摸一樣。這是因?yàn)檎齽t表達(dá)式的模式匹配總是會(huì)尋找字符串中第一個(gè)可能匹配的位置。由于該匹配是從字符串的第一個(gè)字符開始的。因此在這里不考慮他的子串中更短的匹配。

選擇、分組和引用

正則表達(dá)式的語法還包括制定選擇項(xiàng)、子表達(dá)式分組引用前一個(gè)子表達(dá)式的特殊字符。字符“|”用于分割供選擇的字符。例如,/ab|cd|ef/可以匹配“ab”,可以可以匹配符串“cd”,還可以匹配字符串“ef”。/d{3}|[a-z]{4}/匹配的時(shí)三位數(shù)字或者四個(gè)小寫字母。

注意,選擇項(xiàng)的嘗試匹配次序是從左到右,直到發(fā)現(xiàn)匹配項(xiàng)。如果左邊的選擇項(xiàng)匹配,就會(huì)忽略右邊的匹配項(xiàng),即使它產(chǎn)生更好的匹配。因此,當(dāng)正則表達(dá)式/a|ab/匹配字符串“ab”時(shí),它只能匹配第一個(gè)字符。

正則表達(dá)式中的圓括號(hào)有多種作用。第一個(gè)作用是把多帶帶的項(xiàng)組合成子表達(dá)式,以便可以像處理一個(gè)獨(dú)立的單元那樣用“|”、“ * ”、“ + ”或者“ ? ”等來對單元內(nèi)的項(xiàng)進(jìn)行處理。例如,/java(Script)?/可以匹配字符串“java”,其后可以有“Script”也可以沒有。/(ab|cd)+|ef/可以匹配字符串“ef”,也可以匹配字符串“ab”或者“cd”的一次或多次重復(fù)。例如,將“font-size”改為“fontSize”:

var str = "font-size";
str = str.replace(/-(w)/,function(str,$1){
    return $1.toUpperCase();
});
console.log(str); // => fontSize

在正則表達(dá)式中,圓括號(hào)的另一個(gè)作用是在完整的模式中定義子模式。當(dāng)一個(gè)正則表達(dá)式成功地和目標(biāo)字符串相互匹配時(shí),可以從目標(biāo)字符串中抽出和圓括號(hào)匯總的字母是相匹配的部分(我們將在隨后的部分中看到如何取得這些匹配的子串)。例如,嘉定我們正在檢索的模式是一個(gè)或多個(gè)小寫字母后面跟隨了一位或多位數(shù)字,則可以使用模式/[a-z]+d+/。但假定我們真正關(guān)心的是每個(gè)匹配尾部的數(shù)字,那么如果將模式的數(shù)字部分放在括號(hào)中(/[a-z]+(d+)/),就可以從檢索到的匹配中抽取數(shù)字了。如下:

var reg = /[a-z]+d+/;
var str = "abcde123";
str.match(reg); 
// => ["abcde123"]
var reg2 = /[a-z]+(d+)/;
str.match(reg2); 
// => ["abcde123", "123"]

帶圓括號(hào)的表達(dá)式的另一個(gè)用途就是允許在同一正則表達(dá)式的后部引用前面的子表達(dá)式。這是通過在字符“”后加一位或多位數(shù)字來實(shí)現(xiàn)的。這個(gè)數(shù)字指定了帶圓括號(hào)的子表達(dá)式在正則表達(dá)式中的位置。例如,1引用的是第一個(gè)帶圓括號(hào)的子表達(dá)式,3引用的是第三個(gè)帶圓括號(hào)的子表達(dá)式。注意,因?yàn)樽颖磉_(dá)式可以嵌套另外一個(gè)子表達(dá)式,所以它的問題是參與計(jì)數(shù)的左括號(hào)的位置。例如,下面的正則表達(dá)式中,嵌套的子表達(dá)式([Ss]cript)可以使用2來指代

var reg = /([Jj]ava([Ss]cript)?)siss(funw*)/;
var str = "javascript is fun that java";
var match = str.match(reg);
console.log(match);
// => ["javascript is fun", "javascript", "script", "fun"]

對正則表達(dá)式中前一個(gè)子表達(dá)式的引用,并不是只對子表達(dá)式的引用,而是指與那個(gè)模式相匹配的文本的引用。這樣,引用可以用于實(shí)施一條約束,即一個(gè)字符串各個(gè)多帶帶部分包含的是完全相同的字符。例如,下面的正則表達(dá)式匹配的就是位于單引號(hào)或雙引號(hào)之內(nèi)的0個(gè)或多個(gè)字符。但是,它并不要求左側(cè)和右側(cè)的引號(hào)匹配(即加入的兩個(gè)引號(hào)都是單引號(hào)或都是雙引號(hào)):

var reg = /[""][^""]*[""]/;
var str = ""hello"";
reg.test(str); // => true

如果要匹配左側(cè)和右側(cè)的引號(hào)完全相同,可以使用如下引用:

var reg = /([""])[^""]*1/;
var str = ""hello"";
reg.test(str); // => false 

因?yàn)樽髠?cè)和右側(cè)的引號(hào)不一致,所以false。1匹配的是第一個(gè)帶圓括號(hào)的子表達(dá)式所匹配的模式。在這個(gè)例子中,存在這樣一條約束,那就是左側(cè)的引號(hào)必須和右側(cè)的引號(hào)相匹配。正則表達(dá)式不允許用雙引號(hào)括起來的內(nèi)容有單引號(hào),反之亦然。不能在字符類中使用這種引用,所以下面的寫法是非法的:

var reg = /([""])[^1]*1/;
var str = ""hello"";
reg.test(str); // => false 

正如上面重點(diǎn)標(biāo)注的那段說明。對正則表達(dá)式中前一個(gè)子表達(dá)式的引用,并不是只對子表達(dá)式的引用,而是指與那個(gè)模式相匹配的文本的引用 所以這個(gè)是false。

在接下來,我們會(huì)看到一種帶圓括號(hào)的子表達(dá)式的引用,這是正則表達(dá)式的檢索和替換操作的強(qiáng)大特性之一。

同樣,在正則表達(dá)式中不用創(chuàng)建帶數(shù)字編碼的引用,也可以對子表達(dá)式進(jìn)行分組。它不是以“ ( ”和“ ) ”進(jìn)行分組,而是以“ (?: ”和“ ) ”來進(jìn)行分組,比如,考慮下面這個(gè)模式:

var reg = /([Jj]ava(?:[Ss]cript)?)siss(funw*)/;
var str = "javascript is fun that java";
var match = str.match(reg);
// => ["javascript is fun", "javascript", "fun"]

我們會(huì)發(fā)現(xiàn)這里匹配的結(jié)果跟前面匹配的結(jié)果“["javascript is fun", "javascript", "script", "fun"]”相比,少了一個(gè)"script"。這是因?yàn)樽颖磉_(dá)式(?:[sS]cript)僅僅用于分組,不參與引用。因此復(fù)制符號(hào)"?"可以應(yīng)用到各個(gè)分組。這種改進(jìn)的圓括號(hào)并不生成引用,所以這個(gè)正則表達(dá)式中,2引用了與(funW*)匹配的文本。

下面是對正則表達(dá)式的選擇、分組和引用運(yùn)算符做了總結(jié)。

| 選擇,匹配的是該符號(hào)左邊的子表達(dá)式或右邊的子表達(dá)式

(...) 組合,將幾個(gè)項(xiàng)組合為一個(gè)單元,這個(gè)單元可通過“ * ”、“ ? ”、“ + ”和“ | ”等符號(hào)加以修飾,而且可以記住和這個(gè)組合相匹配的字符串以供此后的引用使用

(?:...) 只組合,把項(xiàng)組合到一個(gè)單元,但不記憶和改組相匹配的字符

和第n個(gè)分組第一次匹配的字符相匹配,組是圓括號(hào)中的子表達(dá)式(也可能是嵌套的),組索引是從左到右的左括號(hào),“(?:”形式的分組不參與編碼

指定匹配位置

正如前面所介紹的,正則表達(dá)式中的多個(gè)元素才能夠匹配字符串中的一個(gè)字符。例如,s匹配的只是一個(gè)空白符。還有一些正則表達(dá)式的元素匹配的是字符之間的位置,而不是實(shí)際的字符。例如,b匹配一個(gè)單詞的邊界,即位于w(ASCII單詞)字符和W(非ASCII單詞)之間的邊界,或位于一個(gè)ASCII單詞與字符串的開始或結(jié)束之間的邊界。像b這樣的元素不匹配某個(gè)可見的字符,它們指定匹配發(fā)生的合法位置。有時(shí)我們稱這些元素為正則表達(dá)式的,因?yàn)樗鼈儗⒛J蕉ㄎ辉谒阉髯址奶囟ㄎ恢蒙稀W畛S玫腻^元素是^,它是用來匹配字符串的起始位置,錨元素$用以匹配字符串的結(jié)束位置。

例如,要匹配單詞“javascript”,可以使用正則表達(dá)式/^[Jj]ava[Ss]cript$/。如果想匹配"java"這個(gè)單詞本身(不像在“JavaScript”中作為單詞的前綴),可以使用正則表達(dá)式/sJava/,可以匹配前后都有空格的單詞“java”。但是這樣做有兩個(gè)問題,第一,如果“java”出現(xiàn)在字符串的開始或者結(jié)尾,就是匹配不成功,除非開始和結(jié)尾處各有一個(gè)空格。第二個(gè)問題是,當(dāng)找到了與之匹配的字符串時(shí),它返回的匹配字符串的前端和后端都有空格沒這并不是我們想要的。因此我們使用單詞的邊界b來代替真正的空格符s進(jìn)行匹配(或定位)。這樣正則表達(dá)式就寫成了/b[Jj]avab/。元素B將把匹配的錨點(diǎn)定位在不適單詞的邊界之處。因此正則表達(dá)式/B[Ss]cript/于“JavaScript”和“posrscript”匹配,但是不與“script”和“Scripting” 匹配。

var reg =/java/;

var str = "javascript is more fun that java";
str.match(reg); // => ["java"]

var str2 = "javascript is more fun that javac";
str.match(reg); // => null

任意正則表達(dá)式都可以作為錨點(diǎn)條件。就像上面例子中/bjavab/中的"java"。如果在富豪“ (?= ”和“ ) ”之間加入一個(gè)表達(dá)式,他就是一個(gè)先行斷言,用以說明圓括號(hào)內(nèi)的表達(dá)式必須正確匹配,但并不是真正意義上的匹配。比如,要匹配一種常用的程序設(shè)計(jì)語言的名字,但只在其后有冒號(hào)時(shí)才匹配,可以使用/[Jj]ava([Ss]cript)?(?=:)/。這個(gè)正則表達(dá)式可以匹配“Javascript: beautiful language”中的“JavaScript”,但是不能匹配“java in a Nutshell”中的“Java”,因?yàn)樗竺鏇]有冒號(hào)。

var reg =/[Jj]ava([Ss]cript)?(?=:)/;
var str1 = "Javascript: beautiful language";
str1.match(reg); // => ["Javascript", "script"]
var str2 = "java in a Nutshell";
str2.match(reg); // => null

帶有“ (?! ”的斷言是負(fù)向先行斷言,用一指定接下來的字符都不必匹配。例如,/Java(?!Script)[A-Z]w*/可以匹配“Java”后跟隨一個(gè)大寫字母和任意多個(gè)ASCII單詞,但Java后不能跟隨“Script”。它可以匹配”JavaBeans“,但是不能匹配”Javanese“。

var reg = /Java(?!Script)[A-Z]w*/;
var str = "JavaBeans";
str.match(reg); // => ["JavaBeans"]

^ 匹配字符串的開頭,再多行檢索中,匹配一行的開頭

$ 匹配字符串的結(jié)尾,再多行檢索中,匹配一行的結(jié)尾

 匹配一個(gè)單詞的邊界,簡言之,就是位于字符w和W之間的位置,或位于字符W和匹配字符串的開頭或者結(jié)尾的位置

B 匹配非單詞邊界的位置

(?=pattern) 正向先行斷言,要就接下來的字符都與pattern匹配,但是不能包含匹配pattern的那些字符

(?!pattern) 負(fù)向(反向)先行斷言,要就接下來的字符都不與pattern匹配

修飾符

正則表達(dá)式中的語法還有最后一個(gè)知識(shí)點(diǎn),即正則表達(dá)式的修飾符,用以說明高級(jí)匹配模式的規(guī)則。和之前討論的正則表達(dá)式語法不同,修飾符是放在“/”符號(hào)之外的,也就是說,它們不是出現(xiàn)兩條斜線之間,而是第二條斜線之后。JavaScript支持三個(gè)修飾符,修飾符“i”用以說明模式匹配是不區(qū)分大小寫。修飾符“g”說明*模式匹配應(yīng)該是全局的,*也就是說,應(yīng)該找出被檢索字符串中所有的匹配。修飾符“m”用以在多行模式中執(zhí)行匹配,在這種模式下,如果待檢索的字符串包含多行,那么^$錨字符除了匹配整個(gè)字符串的開始和結(jié)尾之外,還能匹配每行的開始和結(jié)束。比如正則表達(dá)式/java$/im可以匹配“java”也可以匹配“Javan is fun”。

var reg = /java$/im;
var str1 = "java";
str1.match(reg); // => ["java"]
var str2 = "java
 is fun";
str2.match(reg); // => ["java"]

這些修飾符可以任意組合,比如,要想不區(qū)分大小寫匹配字符串中的第一個(gè)單詞“java”,可以使用不區(qū)分大小寫的修飾符來定義正則表達(dá)式/bjavab/i。要想匹配字符串中所有單詞,則需要添加修飾符g:/bjavab/gi。

i 執(zhí)行不區(qū)分大小寫的匹配

g 執(zhí)行一個(gè)全局匹配,簡言之,即找到所有的匹配,而不是在找到第一個(gè)之后停止

m 多行匹配模式,^匹配一行的開頭和字符串的開頭,$匹配行的結(jié)尾和字符串的結(jié)尾

獲取指定的querystring

function param(key, url) {
    var reg = new RegExp("(?:^|?|#|&)" + key + "=([^&#]*)(?:$|&|#)", "i");
    var o = reg.exec(url || location.href);
    return o ? encodeURI(o[1]) : "";
}

獲取所有的querystring

function getAllParam() {
    var reg=/[?&]([^=?&]+)=([^=?&]+)/ig
    var url={};
    while(reg.exec(location.href)){
        url[RegExp.$1]=RegExp.$2;
    }
    return url;
}

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/79852.html

相關(guān)文章

  • JavaScript正則達(dá)式的匹配模式

    摘要:選擇分組和引用正則表達(dá)式的語法還包括指定選擇項(xiàng)子表達(dá)式分組和引用前一子表達(dá)式的特殊字符。帶圓括號(hào)的表達(dá)式的另一個(gè)用途是允許在同一正則表達(dá)式的后部引用前面的子表達(dá)式。 正則表達(dá)式(regular expression)是一個(gè)描述字符模式的對象。JavaScript的 RegExp類 表示正則表達(dá)式,String和RegExp都定義了方法,后者使用正則表達(dá)式進(jìn) 行強(qiáng)大的模式匹配和文本檢索與...

    wqj97 評(píng)論0 收藏0
  • JavaScript中的正則達(dá)式

    Javascript的正則表達(dá)式是前端中比較重要的部分,正則表達(dá)式主要用于字符串處理,表單驗(yàn)證等場合,實(shí)用高效,文章主要對JavaScript中的正則的學(xué)習(xí)與總結(jié) 正則表達(dá)式的定義 正則表達(dá)式:是一個(gè)描述字符模式的對象,JavaScrip中正則表達(dá)式用RegExp對象表示,可以使用RegExp構(gòu)造函數(shù)來創(chuàng)建正則對象 正則表達(dá)式的創(chuàng)建 1.字面量創(chuàng)建 var reg = /[a-z]/; 2.構(gòu)...

    _Zhao 評(píng)論0 收藏0
  • JS中的正則達(dá)式

    摘要:構(gòu)造函數(shù)可以有兩個(gè)字符串參數(shù),第一個(gè)參數(shù)包含正則表達(dá)式的主體部分。只讀的布爾值,說明這個(gè)正則表達(dá)式是否帶有修飾符。中正則的擴(kuò)展構(gòu)造函數(shù)在中,只能接受字符串作為參數(shù),允許其直接接受正則表達(dá)式作為參數(shù)。 上文傳送門:初探正則表達(dá)式 正則表達(dá)式是一個(gè)描述字符模式的對象,JavaScript 的 RegExp 類表示正則表達(dá)式,String 和 RegExp 都定義了方法,后者使用正則表達(dá)式進(jìn)...

    Soarkey 評(píng)論0 收藏0
  • 正則達(dá)式

    摘要:本文內(nèi)容共正則表達(dá)式火拼系列正則表達(dá)式回溯法原理學(xué)習(xí)正則表達(dá)式,是需要懂點(diǎn)兒匹配原理的。正則表達(dá)式迷你書問世了讓幫你生成和解析參數(shù)字符串最全正則表達(dá)式總結(jié)驗(yàn)證號(hào)手機(jī)號(hào)中文郵編身份證地址等是正則表達(dá)式的縮寫,作用是對字符串執(zhí)行模式匹配。 JS 的正則表達(dá)式 正則表達(dá)式 一種幾乎可以在所有的程序設(shè)計(jì)語言里和所有的計(jì)算機(jī)平臺(tái)上使用的文字處理工具。它可以用來查找特定的信息(搜索),也可以用來查...

    bang590 評(píng)論0 收藏0
  • JavaScript 闖關(guān)記》之正則達(dá)式

    摘要:正則表達(dá)式的字符串表示,按照字面量形式而非傳入構(gòu)造函數(shù)中的字符串模式返回。其中,表示匹配項(xiàng)在字符串中的位置,而表示應(yīng)用正則表達(dá)式的字符串。下面列出了正則表達(dá)式所不支持的特性。關(guān)卡按要求完成下列常用的正則表達(dá)式。 由于本課程的核心是 JavaScript,所以本文著重講解了「正則表達(dá)式」在 JavaScript 中的用法,并未深入「正則表達(dá)式」的具體細(xì)節(jié)。如果您尚不了解「正則表達(dá)式」,強(qiáng)...

    TalkingData 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<