正則入門連載?。ǐI(xiàn)給不及格的程序員們)第4/4頁(yè)
更新時(shí)間:2007年02月05日 00:00:00 作者:
不可打印字符
列出用于表示正則表達(dá)式中非打印字符的轉(zhuǎn)義序列。
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
字符匹配
說明正則表達(dá)式如何使用句點(diǎn)、轉(zhuǎn)義符和中括號(hào)創(chuàng)建返回特定結(jié)果的序列。
句點(diǎn) (.) 匹配字符串中的各種打印或非打印字符,只有一個(gè)字符例外。這個(gè)例外就是換行符 (\n)。下面的正則表達(dá)式匹配 aac、abc、acc、adc 等等,以及 a1c、a2c、a-c 和 a#c:
/a.c/
若要匹配包含文件名的字符串,而句點(diǎn) (.) 是輸入字符串的組成部分,請(qǐng)?jiān)谡齽t表達(dá)式中的句點(diǎn)前面加反斜扛 (\) 字符。舉例來說明,下面的正則表達(dá)式匹配 filename.ext:
/filename\.ext/
這些表達(dá)式只讓您匹配“任何”單個(gè)字符??赡苄枰ヅ淞斜碇械奶囟ㄗ址M。例如,可能需要查找用數(shù)字表示的章節(jié)標(biāo)題(Chapter 1、Chapter 2 等等)。
中括號(hào)表達(dá)式
若要?jiǎng)?chuàng)建匹配字符組的一個(gè)列表,請(qǐng)?jiān)诜嚼ㄌ?hào)([ 和 ])內(nèi)放置一個(gè)或更多單個(gè)字符。當(dāng)字符括在中括號(hào)內(nèi)時(shí),該列表稱為“中括號(hào)表達(dá)式”。與在任何別的位置一樣,普通字符在中括號(hào)內(nèi)表示其本身,即,它在輸入文本中匹配一次其本身。大多數(shù)特殊字符在中括號(hào)表達(dá)式內(nèi)出現(xiàn)時(shí)失去它們的意義。不過也有一些例外,如:
如果 ] 字符不是第一項(xiàng),它結(jié)束一個(gè)列表。若要匹配列表中的 ] 字符,請(qǐng)將它放在第一位,緊跟在開始 [ 后面。
\ 字符繼續(xù)作為轉(zhuǎn)義符。若要匹配 \ 字符,請(qǐng)使用 \\。
括在中括號(hào)表達(dá)式中的字符只匹配處于正則表達(dá)式中該位置的單個(gè)字符。以下正則表達(dá)式匹配 Chapter 1、Chapter 2、Chapter 3、Chapter 4 和 Chapter 5:
/Chapter [12345]/
請(qǐng)注意,單詞 Chapter 和后面的空格的位置相對(duì)于中括號(hào)內(nèi)的字符是固定的。中括號(hào)表達(dá)式指定的只是匹配緊跟在單詞 Chapter 和空格后面的單個(gè)字符位置的字符集。這是第九個(gè)字符位置。
若要使用范圍代替字符本身來表示匹配字符組,請(qǐng)使用連字符 (-) 將范圍中的開始字符和結(jié)束字符分開。單個(gè)字符的字符值確定范圍內(nèi)的相對(duì)順序。下面的正則表達(dá)式包含范圍表達(dá)式,該范圍表達(dá)式等效于上面顯示的中括號(hào)中的列表。
/Chapter [1-5]/
當(dāng)以這種方式指定范圍時(shí),開始值和結(jié)束值兩者都包括在范圍內(nèi)。注意,還有一點(diǎn)很重要,按 Unicode 排序順序,開始值必須在結(jié)束值的前面。
若要在中括號(hào)表達(dá)式中包括連字符,請(qǐng)采用下列方法之一:
用反斜扛將它轉(zhuǎn)義:
[\-]
將連字符放在中括號(hào)列表的開始或結(jié)尾。下面的表達(dá)式匹配所有小寫字母和連字符:
[-a-z]
[a-z-]
創(chuàng)建一個(gè)范圍,在該范圍中,開始字符值小于連字符,而結(jié)束字符值等于或大于連字符。下面的兩個(gè)正則表達(dá)式都滿足這一要求:
[!--]
[!-~]
若要查找不在列表或范圍內(nèi)的所有字符,請(qǐng)將插入符號(hào) (^) 放在列表的開頭。如果插入字符出現(xiàn)在列表中的其他任何位置,則它匹配其本身。下面的正則表達(dá)式匹配編號(hào)大于 5 的章節(jié)標(biāo)題:
/Chapter [^12345]/
在上面的示例中,表達(dá)式在第九個(gè)位置匹配 1、2、3、4 或 5 之外的任何數(shù)字字符。這樣,例如,Chapter 7 就是一個(gè)匹配項(xiàng),Chapter 9 也是一個(gè)匹配項(xiàng)。
上面的表達(dá)式可以使用連字符 (-) 來表示:
/Chapter [^1-5]/
中括號(hào)表達(dá)式的典型用途是指定任何大寫或小寫字母或任何數(shù)字的匹配。下面的表達(dá)式指定這樣的匹配:
/[A-Za-z0-9]/
限定符
說明當(dāng)無法指定多少字符構(gòu)成一個(gè)匹配時(shí)如何創(chuàng)建正則表達(dá)式。
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
定位點(diǎn)
說明如何將正則表達(dá)式固定到行首或行尾,以及如何創(chuàng)建在單詞內(nèi)、在單詞的開頭或者在單詞的結(jié)尾出現(xiàn)的正則表達(dá)式。
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
替換和分組
說明替換如何使用“|”字符,以在兩個(gè)或更多替換選項(xiàng)之間選擇,并說明分組如何與替換協(xié)同作用以進(jìn)一步精煉結(jié)果。
替換使用 | 字符來允許在兩個(gè)或多個(gè)替換選項(xiàng)之間進(jìn)行選擇。例如,可以擴(kuò)展章節(jié)標(biāo)題正則表達(dá)式,以返回比章標(biāo)題范圍更廣的匹配項(xiàng)。但是,這并不象您可能認(rèn)為的那樣簡(jiǎn)單。替換匹配 | 字符兩邊的盡可能最大的表達(dá)式。您可能認(rèn)為,下面的表達(dá)式匹配出現(xiàn)在行首和行尾、后面跟一個(gè)或兩個(gè)數(shù)字的 Chapter 或 Section:
/^Chapter|Section [1-9][0-9]{0,1}$/
很遺憾,上面的正則表達(dá)式要么匹配行首的單詞 Chapter,要么匹配行尾的單詞 Section 及跟在其后的任何數(shù)字。如果輸入字符串是 Chapter 22,那么上面的表達(dá)式只匹配單詞 Chapter。如果輸入字符串是 Section 22,那么該表達(dá)式匹配 Section 22。
若要使正則表達(dá)式更易于控制,可以使用括號(hào)來限制替換的范圍,即,確保它只應(yīng)用于兩個(gè)單詞 Chapter 和 Section。但是,括號(hào)也用于創(chuàng)建子表達(dá)式,并可能捕獲它們以供以后使用,這一點(diǎn)在有關(guān)反向引用的那一節(jié)講述。通過在上面的正則表達(dá)式的適當(dāng)位置添加括號(hào),就可以使該正則表達(dá)式匹配 Chapter 1 或 Section 3。
下面的正則表達(dá)式使用括號(hào)來組合 Chapter 和 Section,以便表達(dá)式正確地起作用:
/^(Chapter|Section) [1-9][0-9]{0,1}$/
盡管這些表達(dá)式正確地起作用,但 Chapter|Section 兩側(cè)的括號(hào)也引起兩個(gè)匹配單詞之一被捕獲以供未來使用。由于在上面的表達(dá)式中只有一組括號(hào),因此,只有一個(gè)被捕獲的“子匹配項(xiàng)”。可以通過使用 RegExp 對(duì)象的 $1-$9 屬性來引用此子匹配項(xiàng)。
在上面的示例中,您只需要使用括號(hào)來組合單詞 Chapter 和 Section 之間的選擇。若要防止匹配被保存以備將來使用,請(qǐng)?jiān)诶ㄌ?hào)內(nèi)正則表達(dá)式模式之前放置 ?:。下面的修改提供相同的能力而不保存子匹配項(xiàng):
/^(?:Chapter|Section) [1-9][0-9]{0,1}$/
除 ?: 元字符外,兩個(gè)其他非捕獲元字符創(chuàng)建被稱為“預(yù)測(cè)先行”匹配的某些內(nèi)容。正向預(yù)測(cè)先行使用 ?= 指定,它匹配處于括號(hào)中匹配正則表達(dá)式模式的起始點(diǎn)的搜索字符串。反向預(yù)測(cè)先行使用 ?! 指定,它匹配處于與正則表達(dá)式模式不匹配的字符串的起始點(diǎn)的搜索字符串。
例如,假設(shè)您有一個(gè)文檔,該文檔包含指向 Windows 3.1、Windows 95、Windows 98 和 Windows NT 的引用。再進(jìn)一步假設(shè),您需要更新該文檔,將指向 Windows 95、Windows 98 和 Windows NT 的所有引用更改為 Windows 2000。下面的正則表達(dá)式(這是一個(gè)正向預(yù)測(cè)先行的示例)匹配 Windows 95、Windows 98 和 Windows NT:
/Windows(?=95 |98 |NT )/
找到一處匹配后,緊接著就在匹配的文本(不包括預(yù)測(cè)先行中的字符)之后搜索下一處匹配。例如,如果上面的表達(dá)式匹配 Windows 98,將在 Windows 之后而不是在 98 之后繼續(xù)搜索。
反向引用
說明如何創(chuàng)建可以訪問存儲(chǔ)匹配模式的組成部分的正則表達(dá)式,而不必重新創(chuàng)建構(gòu)成這一匹配模式的正則表達(dá)式。
正則表達(dá)式的最重要功能之一是存儲(chǔ)匹配的模式的一部分以供以后重新使用的能力。您可能想起,若在正則表達(dá)式模式或模式的一部分兩側(cè)加上括號(hào),就會(huì)導(dǎo)致表達(dá)式的一部分被存儲(chǔ)到臨時(shí)緩沖區(qū)中??梢酝ㄟ^使用非捕獲元字符 ?:、?= 或 ?! 來重寫捕獲。
每個(gè)捕獲的子匹配項(xiàng)按照它們?cè)谡齽t表達(dá)式模式中從左到右出現(xiàn)的順序存儲(chǔ)。緩沖區(qū)編號(hào)從 1 開始,最多可存儲(chǔ) 99 個(gè)捕獲的子表達(dá)式??梢允褂?\n 來訪問每個(gè)緩沖區(qū),其中 n 是標(biāo)識(shí)特定緩沖區(qū)的一位或兩位十進(jìn)制數(shù)字。
反向引用的最簡(jiǎn)單的、最有用的應(yīng)用之一,是提供查找文本中兩個(gè)相同的相鄰單詞的匹配項(xiàng)的能力。以下面的句子為例:
Is is the cost of of gasoline going up up?
上面的句子很顯然有多個(gè)重復(fù)的單詞。如果能設(shè)計(jì)一種方法定位該句子,而不必查找每個(gè)單詞的重復(fù)出現(xiàn),那該有多好。下面的正則表達(dá)式使用單個(gè)子表達(dá)式來實(shí)現(xiàn)這一點(diǎn):
/\b([a-z]+) \1\b/gi
捕獲的表達(dá)式,正如 [a-z]+ 指定的,包括一個(gè)或多個(gè)字母。正則表達(dá)式的第二部分是對(duì)以前捕獲的子匹配項(xiàng)的引用,即,單詞的第二個(gè)匹配項(xiàng)正好由括號(hào)表達(dá)式匹配。\1 指定第一個(gè)子匹配項(xiàng)。字邊界元字符確保只檢測(cè)整個(gè)單詞。否則,諸如“is issued”或“this is”之類的詞組將不能正確地被此表達(dá)式識(shí)別。
正則表達(dá)式后面的全局標(biāo)記 (g) 指示,將該表達(dá)式應(yīng)用到輸入字符串中能夠查找到的盡可能多的匹配。表達(dá)式的結(jié)尾處的不區(qū)分大小寫 (i) 標(biāo)記指定不區(qū)分大小寫。多行標(biāo)記指定換行符的兩邊可能出現(xiàn)潛在的匹配。
使用上面的正則表達(dá)式,下面的代碼可以使用子匹配項(xiàng)信息,將文本字符串中的兩個(gè)連續(xù)相同的單詞的匹配項(xiàng)替換為同一單詞的單個(gè)匹配項(xiàng):
var ss = "Is is the cost of of gasoline going up up?.\n";
var re = /\b([a-z]+) \1\b/gim; //Create regular expression pattern.
var rv = ss.replace(re,"$1"); //Replace two occurrences with one.
在 replace 方法內(nèi)使用 $1 引用第一個(gè)保存的子匹配項(xiàng)。如果您有多個(gè)子匹配項(xiàng),您將通過使用 $2、$3 等依次引用它們。
反向引用還可以將通用資源指示符 (URI) 分解為其組件。假定您想將下面的 URI 分解為協(xié)議(ftp、http 等等)、域地址和頁(yè)/路徑:
http://msdn.microsoft.com:80/scripting/default.htm
下面的正則表達(dá)式提供該功能:
/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/
第一個(gè)括號(hào)子表達(dá)式捕獲 Web 地址的協(xié)議部分。該子表達(dá)式匹配在冒號(hào)和兩個(gè)正斜杠前面的任何單詞。第二個(gè)括號(hào)子表達(dá)式捕獲地址的域地址部分。該子表達(dá)式匹配不包括 ^、/ 或 : 字符的任何字符序列。第三個(gè)括號(hào)子表達(dá)式捕獲端口號(hào)(如果指定了的話)。該子表達(dá)式匹配冒號(hào)后面的零個(gè)或多個(gè)數(shù)字。最后,第四個(gè)括號(hào)子表達(dá)式捕獲 Web 地址指定的路徑和/或頁(yè)信息。該子表達(dá)式匹配 # 或空格字符之外的一個(gè)或多個(gè)字符。
將正則表達(dá)式應(yīng)用到上面的 URI,各子匹配項(xiàng)包含下面的內(nèi)容:
RegExp.$1 包含“http”
RegExp.$2 包含“msdn.microsoft.com”
RegExp.$3 包含“:80”
RegExp.$4 包含“/scripting/default.htm”
正則入門 到此結(jié)速 后續(xù)為 深入正則表達(dá)式編程
出版日期 還未確定........
相關(guān)文章
python正則表達(dá)式的使用(實(shí)驗(yàn)代碼)
正則表達(dá)式是一個(gè)特殊的字符序列,它能幫助你方便的檢查一個(gè)字符串是否與某種模式匹配。這篇文章主要介紹了python正則表達(dá)式的使用(實(shí)驗(yàn)代碼),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2019-06-06一個(gè)非常不錯(cuò)的一個(gè)正則練習(xí)JS版
一個(gè)非常不錯(cuò)的一個(gè)正則練習(xí)JS版...2007-06-06Javascript中使用exec進(jìn)行正則表達(dá)式全局匹配時(shí)的注意事項(xiàng)
在 Javascript 中使用 exec 進(jìn)行正則表達(dá)式全局匹配時(shí),有一個(gè)非常容易犯的錯(cuò)誤,這是因?yàn)?exec() 在全局模式下的行為稍微有點(diǎn)復(fù)雜2011-11-11notepad、editplus等軟件常用的文本整理正則表達(dá)式
這篇文章主要介紹了notepad、editplus等軟件常用的文本整理正則表達(dá)式,本文講解了匹配空行、所有空行、空格、換行、2個(gè)以上的空格等正則,需要的朋友可以參考下2015-04-04正則表達(dá)式語(yǔ)法規(guī)則及在Javascript和C#中的使用方法
正則表達(dá)式通常被用來檢索和/或替換那些符合某個(gè)模式的文本內(nèi)容。許多程序設(shè)計(jì)語(yǔ)言都支持利用正則表達(dá)式進(jìn)行字符串操作2013-10-10