javascrip
電白ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!
JavaScript一種直譯式腳本語言,是一種動(dòng)態(tài)類型、弱類型、基于原型的語言,內(nèi)置支持類型。它的解釋器被稱為JavaScript引擎,為瀏覽器的一部分,廣泛用于客戶端的腳本語言,最早是在HTML(標(biāo)準(zhǔn)通用標(biāo)記語言下的一個(gè)應(yīng)用)網(wǎng)頁(yè)上使用,用來給HTML網(wǎng)頁(yè)增加動(dòng)態(tài)功能。
在1995年時(shí),由Netscape公司的Brendan Eich,在網(wǎng)景導(dǎo)航者瀏覽器上首次設(shè)計(jì)實(shí)現(xiàn)而成。因?yàn)镹etscape與Sun合作,Netscape管理層希望它外觀看起來像Java,因此取名為JavaScript。但實(shí)際上它的語法風(fēng)格與Self及Scheme較為接近。
為了取得技術(shù)優(yōu)勢(shì),微軟推出了JScript,CEnvi推出ScriptEase,與JavaScript同樣可在瀏覽器上運(yùn)行。為了統(tǒng)一規(guī)格,因?yàn)镴avaScript兼容于ECMA標(biāo)準(zhǔn),因此也稱為ECMAScript。
組成部分
ECMAScript,描述了該語 javascript組成 ,言的語法和基本對(duì)象。
文檔對(duì)象模型(DOM),描述處理網(wǎng)頁(yè)內(nèi)容的方法和接口。
瀏覽器對(duì)象模型(BOM),描述與瀏覽器進(jìn)行交互的方法和接口。
基本特點(diǎn)
JavaScript是一種屬于網(wǎng)絡(luò)的腳本語言,已經(jīng)被廣泛用于Web應(yīng)用開發(fā),常用來為網(wǎng)頁(yè)添加各式各樣的動(dòng)態(tài)功能,為用戶提供更流暢美觀的瀏覽效果。通常JavaScript腳本是通過嵌入在HTML中來實(shí)現(xiàn)自身的功能的。
是一種解釋性腳本語言(代碼不進(jìn)行預(yù)編譯)。
主要用來向HTML(標(biāo)準(zhǔn)通用標(biāo)記語言下的一個(gè)應(yīng)用)頁(yè)面添加交互行為。
可以直接嵌入HTML頁(yè)面,但寫成單獨(dú)的js文件有利于結(jié)構(gòu)和行為的分離。
跨平臺(tái)特性,在絕大多數(shù)瀏覽器的支持下,可以在多種平臺(tái)下運(yùn)行(如Windows、Linux、Mac、Android、iOS等)。
Javascript腳本語言同其他語言一樣,有它自身的基本數(shù)據(jù)類型,表達(dá)式和算術(shù)運(yùn)算符及程序的基本程序框架。Javascript提供了四種基本的數(shù)據(jù)類型和兩種特殊數(shù)據(jù)類型用來處理數(shù)據(jù)和文字。而變量提供存放信息的地方,表達(dá)式則可以完成較復(fù)雜的信息處理。
日常用途
1.嵌入動(dòng)態(tài)文本于HTML頁(yè)面。
2.對(duì)瀏覽器事件做出響應(yīng)。
3.讀寫HTML元素。
4.在數(shù)據(jù)被提交到服務(wù)器之前驗(yàn)證數(shù)據(jù)。
5.檢測(cè)訪客的瀏覽器信息。
6.控制cookies,包括創(chuàng)建和修改等。
7.基于Node.js技術(shù)進(jìn)行服務(wù)器端編程。
歷史
它最初由Netscape的Brendan Eich設(shè)計(jì)。JavaScript是甲骨文公司的注冊(cè)商標(biāo)。Ecma國(guó)際以JavaScript為基礎(chǔ)制定了ECMAScript標(biāo)準(zhǔn)。JavaScript也可以用于其他場(chǎng)合,如服務(wù)器端編程。完整的JavaScript實(shí)現(xiàn)包含三個(gè)部分:ECMAScript,文檔對(duì)象模型,瀏覽器對(duì)象模型。
Netscape在最初將其腳本語言命名為L(zhǎng)iveScript,后來Netscape在與Sun合作之后將其改名為JavaScript。JavaScript最初受Java啟發(fā)而開始設(shè)計(jì)的,目的之一就是“看上去像Java”,因此語法上有類似之處,一些名稱和命名規(guī)范也借自Java。但JavaScript的主要設(shè)計(jì)原則源自Self和Scheme。JavaScript與Java名稱上的近似,是當(dāng)時(shí)Netscape為了營(yíng)銷考慮與Sun微系統(tǒng)達(dá)成協(xié)議的結(jié)果。為了取得技術(shù)優(yōu)勢(shì),微軟推出了JScript來迎戰(zhàn)JavaScript的腳本語言。為了互用性,Ecma國(guó)際(前身為歐洲計(jì)算機(jī)制造商協(xié)會(huì))創(chuàng)建了ECMA-262標(biāo)準(zhǔn)(ECMAScript)。兩者都屬于ECMAScript的實(shí)現(xiàn)。盡管JavaScript作為給非程序人員的腳本語言,而非作為給程序人員的腳本語言來推廣和宣傳,但是JavaScript具有非常豐富的特性。
現(xiàn)在很多小伙伴喜歡在互聯(lián)網(wǎng)上找視頻資料學(xué)習(xí)javascript,但是光看視頻你是不可能學(xué)會(huì)javascript的,沒有人指導(dǎo)你,而且很多視頻已經(jīng)過時(shí)了 并沒有什么用! ?如果你真的想學(xué)習(xí)javascript這門技術(shù),你可以來這個(gè)群,前面是5柒3,中間是82〇,最后是49〇, 在這里有最新的javascript課程 免費(fèi)學(xué)習(xí) 也有很多人指導(dǎo)你 進(jìn)步 不需要你付出什么 只要你有一顆學(xué)習(xí)的心就可以了 不是愿意學(xué)習(xí)或者自認(rèn)不需要學(xué)習(xí)的就不要加了。
發(fā)展初期,JavaScript的標(biāo)準(zhǔn)并未確定,同期有Netscape的JavaScript,微軟的JScript和CEnvi的ScriptEase三足鼎立。1997年,在ECMA(歐洲計(jì)算機(jī)制造商協(xié)會(huì))的協(xié)調(diào)下,由Netscape、Sun、微軟、Borland組成的工作組確定統(tǒng)一標(biāo)準(zhǔn):ECMA-262。
特性
JavaScript腳本語言具有以下特點(diǎn):
(1)腳本語言。JavaScript是一種解釋型的腳本語言,C、C++等語言先編譯后執(zhí)行,而JavaScript是在程序的運(yùn)行過程中逐行進(jìn)行解釋。
(2)基于對(duì)象。JavaScript是一種基于對(duì)象的腳本語言,它不僅可以創(chuàng)建對(duì)象,也能使用現(xiàn)有的對(duì)象。
(3)簡(jiǎn)單。JavaScript語言中采用的是弱類型的變量類型,對(duì)使用的數(shù)據(jù)類型未做出嚴(yán)格的要求,是基于Java基本語句和控制的腳本語言,其設(shè)計(jì)簡(jiǎn)單緊湊。
(4)動(dòng)態(tài)性。JavaScript是一種采用事件驅(qū)動(dòng)的腳本語言,它不需要經(jīng)過Web服務(wù)器就可以對(duì)用戶的輸入做出響應(yīng)。在訪問一個(gè)網(wǎng)頁(yè)時(shí),鼠標(biāo)在網(wǎng)頁(yè)中進(jìn)行鼠標(biāo)點(diǎn)擊或上下移、窗口移動(dòng)等操作JavaScript都可直接對(duì)這些事件給出相應(yīng)的響應(yīng)。
(5)跨平臺(tái)性。JavaScript腳本語言不依賴于操作系統(tǒng),僅需要瀏覽器的支持。因此一個(gè)JavaScript腳本在編寫后可以帶到任意機(jī)器上使用,前提上機(jī)器上的瀏覽器支 持JavaScript腳本語言,目前JavaScript已被大多數(shù)的瀏覽器所支持。[3]
不同于服務(wù)器端腳本語言,例如PHP與ASP,JavaScript主要被作為客戶端腳本語言在用戶的瀏覽器上運(yùn)行,不需要服務(wù)器的支持。所以在早期程序員比較青睞于JavaScript以減少對(duì)服務(wù)器的負(fù)擔(dān),而與此同時(shí)也帶來另一個(gè)問題:安全性。
而隨著服務(wù)器的強(qiáng)壯,雖然程序員更喜歡運(yùn)行于服務(wù)端的腳本以保證安全,但JavaScript仍然以其跨平臺(tái)、容易上手等優(yōu)勢(shì)大行其道。同時(shí),有些特殊功能(如AJAX)必須依賴Javascript在客戶端進(jìn)行支持。隨著引擎如V8和框架如Node.js的發(fā)展,及其事件驅(qū)動(dòng)及異步IO等特性,JavaScript逐漸被用來編寫服務(wù)器端程序。
第一種方式中的匿名函數(shù)是廢的, 沒辦法再調(diào)用到. 第二種方式才是正解.
嚴(yán)格的說javascript并沒有面向?qū)ο笠徽f, 沒有嚴(yán)格的類的封裝.
如果你需要在一個(gè)方法內(nèi)部再定義另一個(gè)方法, 那也是允許的.以你的這個(gè)為例
class.prototype.a= function (){
this.b = function() { alert('a');};// 不過這個(gè)方法僅在a方法已經(jīng)調(diào)用過的情況下才能起作用
};
不過現(xiàn)在javascript的新標(biāo)準(zhǔn)ECMAScript 5中對(duì)對(duì)象的使用又有了改進(jìn), 更加貼近面向?qū)ο? 你如果想了解更多, 可以去看看這個(gè)新標(biāo)準(zhǔn)
JavaScript是一種基于對(duì)象和事件驅(qū)動(dòng)并具有相對(duì)安全性的客戶端腳本語言。同時(shí)也是一種廣泛用于客戶端Web開發(fā)的腳本語言,常用來給HTML網(wǎng)頁(yè)添加動(dòng)態(tài)功能,比如響應(yīng)用戶的各種操作。它最初由網(wǎng)景公司(Netscape)的Brendan Eich設(shè)計(jì),是一種動(dòng)態(tài)、弱類型、基于原型的語言,內(nèi)置支持類。JavaScript是Sun公司的注冊(cè)商標(biāo)。Ecma國(guó)際以JavaScript為基礎(chǔ)制定了ECMAScript標(biāo)準(zhǔn)。JavaScript也可以用于其他場(chǎng)合,如服務(wù)器端編程。完整的JavaScript實(shí)現(xiàn)包含三個(gè)部分:ECMAScript,文檔對(duì)象模型,字節(jié)順序記號(hào)。
Netscape公司在最初將其腳本語言命名為L(zhǎng)iveScript。在Netscape在與Sun合作之后將其改名為JavaScript。JavaScript最初受Java啟發(fā)而開始設(shè)計(jì)的,目的之一就是“看上去像Java”[1],因此語法上有類似之處,一些名稱和命名規(guī)范也借自Java。但JavaScript的主要設(shè)計(jì)原則源自Self和Scheme[2]。JavaScript與Java名稱上的近似,是當(dāng)時(shí)網(wǎng)景為了營(yíng)銷[3]考慮與Sun公司達(dá)成協(xié)議的結(jié)果。為了取得技術(shù)優(yōu)勢(shì),微軟推出了JScript腳本語言。Ecma國(guó)際(前身為歐洲計(jì)算機(jī)制造商協(xié)會(huì))創(chuàng)建了ECMA-262標(biāo)準(zhǔn)(ECMAScript)?,F(xiàn)兩者都屬于ECMAScript的實(shí)現(xiàn)。盡管JavaScript作為給非程序人員的腳本語言,而非是作為給程序人員的編程語言來推廣和宣傳,但是JavaScript具有非常豐富的特性。
前身是 Live Script
正式名稱:ECMAScript
ECMAScript-262是JavaScript標(biāo)準(zhǔn),基于網(wǎng)景(Netscape)公司提出JavaScript語言和微軟公司提出的JScript語言
ECMA開始于1996年,在1997年7月,采納了首個(gè)版本,1998年,該標(biāo)準(zhǔn)成為了國(guó)際ISO標(biāo)準(zhǔn)
正則表達(dá)式規(guī)則
1. 正則表達(dá)式規(guī)則
1.1 普通字符
字母、數(shù)字、漢字、下劃線、以及后邊章節(jié)中沒有特殊定義的標(biāo)點(diǎn)符號(hào),都是"普通字符"。表達(dá)式中的普通字符,在匹配一個(gè)字符串的時(shí)候,匹配與之相同的一個(gè)字符。
舉例1:表達(dá)式 "c",在匹配字符串 "abcde" 時(shí),匹配結(jié)果是:成功;匹配到的內(nèi)容是:"c";匹配到的位置是:開始于2,結(jié)束于3。(注:下標(biāo)從0開始還是從1開始,因當(dāng)前編程語言的不同而可能不同)
舉例2:表達(dá)式 "bcd",在匹配字符串 "abcde" 時(shí),匹配結(jié)果是:成功;匹配到的內(nèi)容是:"bcd";匹配到的位置是:開始于1,結(jié)束于4。
--------------------------------------------------------------------------------
1.2 簡(jiǎn)單的轉(zhuǎn)義字符
一些不便書寫的字符,采用在前面加 "\" 的方法。這些字符其實(shí)我們都已經(jīng)熟知了。
表達(dá)式
可匹配
\r, \n
代表回車和換行符
\t
制表符
\\
代表 "\" 本身
還有其他一些在后邊章節(jié)中有特殊用處的標(biāo)點(diǎn)符號(hào),在前面加 "\" 后,就代表該符號(hào)本身。比如:^, $ 都有特殊意義,如果要想匹配字符串中 "^" 和 "$" 字符,則表達(dá)式就需要寫成 "\^" 和 "\$"。
表達(dá)式
可匹配
\^
匹配 ^ 符號(hào)本身
\$
匹配 $ 符號(hào)本身
\.
匹配小數(shù)點(diǎn)(.)本身
這些轉(zhuǎn)義字符的匹配方法與 "普通字符" 是類似的。也是匹配與之相同的一個(gè)字符。
舉例1:表達(dá)式 "\$d",在匹配字符串 "abc$de" 時(shí),匹配結(jié)果是:成功;匹配到的內(nèi)容是:"$d";匹配到的位置是:開始于3,結(jié)束于5。
--------------------------------------------------------------------------------
1.3 能夠與 '多種字符' 匹配的表達(dá)式
正則表達(dá)式中的一些表示方法,可以匹配 '多種字符' 其中的任意一個(gè)字符。比如,表達(dá)式 "\d" 可以匹配任意一個(gè)數(shù)字。雖然可以匹配其中任意字符,但是只能是一個(gè),不是多個(gè)。這就好比玩撲克牌時(shí)候,大小王可以代替任意一張牌,但是只能代替一張牌。
表達(dá)式
可匹配
\d
任意一個(gè)數(shù)字,0~9 中的任意一個(gè)
\w
任意一個(gè)字母或數(shù)字或下劃線,也就是 A~Z,a~z,0~9,_ 中任意一個(gè)
\s
包括空格、制表符、換頁(yè)符等空白字符的其中任意一個(gè)
.
小數(shù)點(diǎn)可以匹配除了換行符(\n)以外的任意一個(gè)字符
舉例1:表達(dá)式 "\d\d",在匹配 "abc123" 時(shí),匹配的結(jié)果是:成功;匹配到的內(nèi)容是:"12";匹配到的位置是:開始于3,結(jié)束于5。
舉例2:表達(dá)式 "a.\d",在匹配 "aaa100" 時(shí),匹配的結(jié)果是:成功;匹配到的內(nèi)容是:"aa1";匹配到的位置是:開始于1,結(jié)束于4。
--------------------------------------------------------------------------------
1.4 自定義能夠匹配 '多種字符' 的表達(dá)式
使用方括號(hào) [ ] 包含一系列字符,能夠匹配其中任意一個(gè)字符。用 [^ ] 包含一系列字符,則能夠匹配其中字符之外的任意一個(gè)字符。同樣的道理,雖然可以匹配其中任意一個(gè),但是只能是一個(gè),不是多個(gè)。
表達(dá)式
可匹配
[ab5@]
匹配 "a" 或 "b" 或 "5" 或 "@"
[^abc]
匹配 "a","b","c" 之外的任意一個(gè)字符
[f-k]
匹配 "f"~"k" 之間的任意一個(gè)字母
[^A-F0-3]
匹配 "A"~"F","0"~"3" 之外的任意一個(gè)字符
舉例1:表達(dá)式 "[bcd][bcd]" 匹配 "abc123" 時(shí),匹配的結(jié)果是:成功;匹配到的內(nèi)容是:"bc";匹配到的位置是:開始于1,結(jié)束于3。
舉例2:表達(dá)式 "[^abc]" 匹配 "abc123" 時(shí),匹配的結(jié)果是:成功;匹配到的內(nèi)容是:"1";匹配到的位置是:開始于3,結(jié)束于4。
--------------------------------------------------------------------------------
1.5 修飾匹配次數(shù)的特殊符號(hào)
前面章節(jié)中講到的表達(dá)式,無論是只能匹配一種字符的表達(dá)式,還是可以匹配多種字符其中任意一個(gè)的表達(dá)式,都只能匹配一次。如果使用表達(dá)式再加上修飾匹配次數(shù)的特殊符號(hào),那么不用重復(fù)書寫表達(dá)式就可以重復(fù)匹配。
使用方法是:"次數(shù)修飾"放在"被修飾的表達(dá)式"后邊。比如:"[bcd][bcd]" 可以寫成 "[bcd]{2}"。
表達(dá)式
作用
{n}
表達(dá)式重復(fù)n次,比如:"\w{2}" 相當(dāng)于 "\w\w";"a{5}" 相當(dāng)于 "aaaaa"
{m,n}
表達(dá)式至少重復(fù)m次,最多重復(fù)n次,比如:"ba{1,3}"可以匹配 "ba"或"baa"或"baaa"
{m,}
表達(dá)式至少重復(fù)m次,比如:"\w\d{2,}"可以匹配 "a12","_456","M12344"...
?
匹配表達(dá)式0次或者1次,相當(dāng)于 {0,1},比如:"a[cd]?"可以匹配 "a","ac","ad"
+
表達(dá)式至少出現(xiàn)1次,相當(dāng)于 {1,},比如:"a+b"可以匹配 "ab","aab","aaab"...
*
表達(dá)式不出現(xiàn)或出現(xiàn)任意次,相當(dāng)于 {0,},比如:"\^*b"可以匹配 "b","^^^b"...
舉例1:表達(dá)式 "\d+\.?\d*" 在匹配 "It costs $12.5" 時(shí),匹配的結(jié)果是:成功;匹配到的內(nèi)容是:"12.5";匹配到的位置是:開始于10,結(jié)束于14。
舉例2:表達(dá)式 "go{2,8}gle" 在匹配 "Ads by goooooogle" 時(shí),匹配的結(jié)果是:成功;匹配到的內(nèi)容是:"goooooogle";匹配到的位置是:開始于7,結(jié)束于17。
--------------------------------------------------------------------------------
1.6 其他一些代表抽象意義的特殊符號(hào)
一些符號(hào)在表達(dá)式中代表抽象的特殊意義:
表達(dá)式
作用
^
與字符串開始的地方匹配,不匹配任何字符
$
與字符串結(jié)束的地方匹配,不匹配任何字符
\b
匹配一個(gè)單詞邊界,也就是單詞和空格之間的位置,不匹配任何字符
進(jìn)一步的文字說明仍然比較抽象,因此,舉例幫助大家理解。
舉例1:表達(dá)式 "^aaa" 在匹配 "xxx aaa xxx" 時(shí),匹配結(jié)果是:失敗。因?yàn)?"^" 要求與字符串開始的地方匹配,因此,只有當(dāng) "aaa" 位于字符串的開頭的時(shí)候,"^aaa" 才能匹配,比如:"aaa xxx xxx"。
舉例2:表達(dá)式 "aaa$" 在匹配 "xxx aaa xxx" 時(shí),匹配結(jié)果是:失敗。因?yàn)?"$" 要求與字符串結(jié)束的地方匹配,因此,只有當(dāng) "aaa" 位于字符串的結(jié)尾的時(shí)候,"aaa$" 才能匹配,比如:"xxx xxx aaa"。
舉例3:表達(dá)式 ".\b." 在匹配 "@@@abc" 時(shí),匹配結(jié)果是:成功;匹配到的內(nèi)容是:"@a";匹配到的位置是:開始于2,結(jié)束于4。
進(jìn)一步說明:"\b" 與 "^" 和 "$" 類似,本身不匹配任何字符,但是它要求它在匹配結(jié)果中所處位置的左右兩邊,其中一邊是 "\w" 范圍,另一邊是 非"\w" 的范圍。
舉例4:表達(dá)式 "\bend\b" 在匹配 "weekend,endfor,end" 時(shí),匹配結(jié)果是:成功;匹配到的內(nèi)容是:"end";匹配到的位置是:開始于15,結(jié)束于18。
一些符號(hào)可以影響表達(dá)式內(nèi)部的子表達(dá)式之間的關(guān)系:
表達(dá)式
作用
|
左右兩邊表達(dá)式之間 "或" 關(guān)系,匹配左邊或者右邊
( )
(1). 在被修飾匹配次數(shù)的時(shí)候,括號(hào)中的表達(dá)式可以作為整體被修飾
(2). 取匹配結(jié)果的時(shí)候,括號(hào)中的表達(dá)式匹配到的內(nèi)容可以被單獨(dú)得到
舉例5:表達(dá)式 "Tom|Jack" 在匹配字符串 "I'm Tom, he is Jack" 時(shí),匹配結(jié)果是:成功;匹配到的內(nèi)容是:"Tom";匹配到的位置是:開始于4,結(jié)束于7。匹配下一個(gè)時(shí),匹配結(jié)果是:成功;匹配到的內(nèi)容是:"Jack";匹配到的位置時(shí):開始于15,結(jié)束于19。
舉例6:表達(dá)式 "(go\s*)+" 在匹配 "Let's go go go!" 時(shí),匹配結(jié)果是:成功;匹配到內(nèi)容是:"go go go";匹配到的位置是:開始于6,結(jié)束于14。
舉例7:表達(dá)式 "¥(\d+\.?\d*)" 在匹配 "$10.9,¥20.5" 時(shí),匹配的結(jié)果是:成功;匹配到的內(nèi)容是:"¥20.5";匹配到的位置是:開始于6,結(jié)束于10。單獨(dú)獲取括號(hào)范圍匹配到的內(nèi)容是:"20.5"。
--------------------------------------------------------------------------------
2. 正則表達(dá)式中的一些高級(jí)規(guī)則
2.1 匹配次數(shù)中的貪婪與非貪婪
在使用修飾匹配次數(shù)的特殊符號(hào)時(shí),有幾種表示方法可以使同一個(gè)表達(dá)式能夠匹配不同的次數(shù),比如:"{m,n}", "{m,}", "?", "*", "+",具體匹配的次數(shù)隨被匹配的字符串而定。這種重復(fù)匹配不定次數(shù)的表達(dá)式在匹配過程中,總是盡可能多的匹配。比如,針對(duì)文本 "dxxxdxxxd",舉例如下:
表達(dá)式
匹配結(jié)果
(d)(\w+)
"\w+" 將匹配第一個(gè) "d" 之后的所有字符 "xxxdxxxd"
(d)(\w+)(d)
"\w+" 將匹配第一個(gè) "d" 和最后一個(gè) "d" 之間的所有字符 "xxxdxxx"。雖然 "\w+" 也能夠匹配上最后一個(gè) "d",但是為了使整個(gè)表達(dá)式匹配成功,"\w+" 可以 "讓出" 它本來能夠匹配的最后一個(gè) "d"
由此可見,"\w+" 在匹配的時(shí)候,總是盡可能多的匹配符合它規(guī)則的字符。雖然第二個(gè)舉例中,它沒有匹配最后一個(gè) "d",但那也是為了讓整個(gè)表達(dá)式能夠匹配成功。同理,帶 "*" 和 "{m,n}" 的表達(dá)式都是盡可能地多匹配,帶 "?" 的表達(dá)式在可匹配可不匹配的時(shí)候,也是盡可能的 "要匹配"。這 種匹配原則就叫作 "貪婪" 模式 。
非貪婪模式:
在修飾匹配次數(shù)的特殊符號(hào)后再加上一個(gè) "?" 號(hào),則可以使匹配次數(shù)不定的表達(dá)式盡可能少的匹配,使可匹配可不匹配的表達(dá)式,盡可能的 "不匹配"。這種匹配原則叫作 "非貪婪" 模式,也叫作 "勉強(qiáng)" 模式。如果少匹配就會(huì)導(dǎo)致整個(gè)表達(dá)式匹配失敗的時(shí)候,與貪婪模式類似,非貪婪模式會(huì)最小限度的再匹配一些,以使整個(gè)表達(dá)式匹配成功。舉例如下,針對(duì)文本 "dxxxdxxxd" 舉例:
表達(dá)式
匹配結(jié)果
(d)(\w+?)
"\w+?" 將盡可能少的匹配第一個(gè) "d" 之后的字符,結(jié)果是:"\w+?" 只匹配了一個(gè) "x"
(d)(\w+?)(d)
為了讓整個(gè)表達(dá)式匹配成功,"\w+?" 不得不匹配 "xxx" 才可以讓后邊的 "d" 匹配,從而使整個(gè)表達(dá)式匹配成功。因此,結(jié)果是:"\w+?" 匹配 "xxx"
更多的情況,舉例如下:
舉例1:表達(dá)式 "td(.*)/td" 與字符串 "tdpaa/p/td tdpbb/p/td" 匹配時(shí),匹配的結(jié)果是:成功;匹配到的內(nèi)容是 "tdpaa/p/td tdpbb/p/td" 整個(gè)字符串, 表達(dá)式中的 "/td" 將與字符串中最后一個(gè) "/td" 匹配。
舉例2:相比之下,表達(dá)式 "td(.*?)/td" 匹配舉例1中同樣的字符串時(shí),將只得到 "tdpaa/p/td", 再次匹配下一個(gè)時(shí),可以得到第二個(gè) "tdpbb/p/td"。
--------------------------------------------------------------------------------
2.2 反向引用 \1, \2...
表達(dá)式在匹配時(shí),表達(dá)式引擎會(huì)將小括號(hào) "( )" 包含的表達(dá)式所匹配到的字符串記錄下來。在獲取匹配結(jié)果的時(shí)候,小括號(hào)包含的表達(dá)式所匹配到的字符串可以單獨(dú)獲取。這一點(diǎn),在前面的舉例中,已經(jīng)多次展示了。在實(shí)際應(yīng)用場(chǎng)合中,當(dāng)用某種邊界來查找,而所要獲取的內(nèi)容又不包含邊界時(shí),必須使用小括號(hào)來指定所要的范圍。比如前面的 "td(.*?)/td"。
其實(shí),"小括號(hào)包含的表達(dá)式所匹配到的字符串" 不僅是在匹配結(jié)束后才可以使用,在匹配過程中也可以使用。表達(dá)式后邊的部分,可以引用前面 "括號(hào)內(nèi)的子匹配已經(jīng)匹配到的字符串"。引用方法是 "\" 加上一個(gè)數(shù)字。"\1" 引用第1對(duì)括號(hào)內(nèi)匹配到的字符串,"\2" 引用第2對(duì)括號(hào)內(nèi)匹配到的字符串……以此類推,如果一對(duì)括號(hào)內(nèi)包含另一對(duì)括號(hào),則外層的括號(hào)先排序號(hào)。換句話說,哪一對(duì)的左括號(hào) "(" 在前,那這一對(duì)就先排序號(hào)。
舉例如下:
舉例1:表達(dá)式 "('|")(.*?)(\1)" 在匹配 " 'Hello', "World" " 時(shí),匹配結(jié)果是:成功;匹配到的內(nèi)容是:" 'Hello' "。再次匹配下一個(gè)時(shí),可以匹配到 " "World" "。
舉例2:表達(dá)式 "(\w)\1{4,}" 在匹配 "aa bbbb abcdefg ccccc 111121111 999999999" 時(shí),匹配結(jié)果是:成功;匹配到的內(nèi)容是 "ccccc"。再次匹配下一個(gè)時(shí),將得到 999999999。這個(gè)表達(dá)式要求 "\w" 范圍的字符至少重復(fù)5次,注意與 "\w{5,}" 之間的區(qū)別。
舉例3:表達(dá)式 "(\w+)\s*(\w+(=('|").*?\4)?\s*)*.*?/\1" 在匹配 "td id='td1' style="bgcolor:white"/td" 時(shí),匹配結(jié)果是成功。如果 "td" 與 "/td" 不配對(duì),則會(huì)匹配失??;如果改成其他配對(duì),也可以匹配成功。
正則表達(dá)式規(guī)則如下:
表達(dá)式 描述 表達(dá)式 描述
^ 匹配行首 $ 匹配行尾
. 匹配任何單個(gè)字符 [] 匹配集合中的字符
[^] 匹配不在集合中的字符 ? 匹配前一個(gè)樣式0或1次
* 匹配前一個(gè)樣式0或更多次 + 匹配前一個(gè)樣式1或更多次
| 匹配前一個(gè)或后一個(gè)樣式 匹配前一個(gè)樣式0或更多次
# 匹配前一個(gè)樣式1或更多次 {} Group char to form one pattern
() Group and remember \ 下一個(gè)字符直接用原意(只對(duì)a-z之外的字符有效)
匹配詞的開始 匹配詞的結(jié)尾
\x## 匹配ASCII碼為##(16進(jìn)制)的字符 \N### 匹配ASCII碼為##(10進(jìn)制)的字符
\o### 匹配ASCII碼為##(8進(jìn)制)的字符 \a 匹配 \a
\b 匹配 \b \f 匹配 \f
\r 匹配 0x13(回車) \t 匹配 0x09(跳格)
\v 匹配 \v \e 匹配 Esc(0x05)
\n 匹配0x10(換行) \s 匹配空格(回車,換行,制表符,空格)
\S 匹配非空格(!\s) \w 整字匹配
\W 非整字匹配 \d 匹配數(shù)字
\D 匹配非數(shù)字 \U 匹配大寫字母
\L 匹配小寫字母 \C 后面開始大小寫敏感
\c 后面開始大小寫不敏感 \# 匹配前面定義的組(#: 1-9, a-f)