正則表達(dá)式 – 示例

2022-11-28 15:47 更新

簡(jiǎn)單表達(dá)式

正則表達(dá)式的最簡(jiǎn)單形式是在搜索字符串中匹配其本身的單個(gè)普通字符。例如,單字符模式,如 A,不論出現(xiàn)在搜索字符串中的何處,它總是匹配字母 A。下面是一些單字符正則表達(dá)式模式的示例:

/a/
/7/
/M/

可以將許多單字符組合起來(lái)以形成大的表達(dá)式。例如,以下正則表達(dá)式組合了單字符表達(dá)式:a、7 和 M。

/a7M/

請(qǐng)注意,沒(méi)有串聯(lián)運(yùn)算符。只須在一個(gè)字符后面鍵入另一個(gè)字符。

字符匹配

句點(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)前面加反斜杠 (\) 字符。舉例來(lái)說(shuō)明,下面的正則表達(dá)式匹配 filename.ext:

/filename\.ext/

這些表達(dá)式只讓您匹配"任何"單個(gè)字符??赡苄枰ヅ淞斜碇械奶囟ㄗ址M。例如,可能需要查找用數(shù)字表示的章節(jié)標(biāo)題(Chapter 1、Chapter 2 等等)。

一個(gè)合理的用戶名正則表達(dá)式

用戶名可以包含以下幾種字符:

  1. 26 個(gè)大小寫英文字母表示為 a-zA-Z。
  2. 數(shù)字表示為 0-9。
  3. 下劃線表示為 _。
  4. 中劃線表示為 -。

用戶名由若干個(gè)字母、數(shù)字、下劃線和中劃線組成,所以需要用到 + 表示 1 次或多次出現(xiàn)。

根據(jù)以上條件得出用戶名的表達(dá)式可以為:

[a-zA-Z0-9_-]+

實(shí)例

var str = "abc123-_def";

var patt = /[a-zA-Z0-9_-]+/;

document.write(str.match(patt));

以下標(biāo)記的文本是獲得的匹配的表達(dá)式:

abc123-_def


嘗試一下 ?


如果不需要中劃線則為:

[a-zA-Z0-9_]+

實(shí)例

var str = "abc123def";

var str2 = "abc123_def";

var patt = /[a-zA-Z0-9_]+/;

document.write(str.match(patt));

document.write(str2.match(patt));

以下標(biāo)記的文本是獲得的匹配的表達(dá)式:

abc123def

abc123_def


嘗試一下 ?

中括號(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í)失去它們的意義。不過(guò)也有一些例外,如:

  • 如果 ] 字符不是第一項(xiàng),它結(jié)束一個(gè)列表。若要匹配列表中的 ] 字符,請(qǐng)將它放在第一位,緊跟在開(kāi)始 [ 后面。
  • \ 字符繼續(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è)字符位置。

若要使用范圍代替字符本身來(lái)表示匹配字符組,請(qǐng)使用連字符 (-) 將范圍中的開(kāi)始字符和結(jié)束字符分開(kāi)。單個(gè)字符的字符值確定范圍內(nèi)的相對(duì)順序。下面的正則表達(dá)式包含范圍表達(dá)式,該范圍表達(dá)式等效于上面顯示的中括號(hào)中的列表。

/Chapter [1-5]/

當(dāng)以這種方式指定范圍時(shí),開(kāi)始值和結(jié)束值兩者都包括在范圍內(nèi)。注意,還有一點(diǎn)很重要,按 Unicode 排序順序,開(kāi)始值必須在結(jié)束值的前面。

若要在中括號(hào)表達(dá)式中包括連字符,請(qǐng)采用下列方法之一:

  • 用反斜杠將它轉(zhuǎn)義:
[\-]
  • 將連字符放在中括號(hào)列表的開(kāi)始或結(jié)尾。下面的表達(dá)式匹配所有小寫字母和連字符:
[-a-z]
[a-z-]
  • 創(chuàng)建一個(gè)范圍,在該范圍中,開(kāi)始字符值小于連字符,而結(jié)束字符值等于或大于連字符。下面的兩個(gè)正則表達(dá)式都滿足這一要求:
[!--]
[!-~]

若要查找不在列表或范圍內(nèi)的所有字符,請(qǐng)將插入符號(hào) (^) 放在列表的開(kāi)頭。如果插入字符出現(xiàn)在列表中的其他任何位置,則它匹配其本身。下面的正則表達(dá)式匹配1、2、3、4 或 5 之外的任何數(shù)字和字符:

/Chapter [^12345]/

在上面的示例中,表達(dá)式在第九個(gè)位置匹配 1、2、3、4 或 5 之外的任何數(shù)字和字符。這樣,例如,Chapter 7 就是一個(gè)匹配項(xiàng),Chapter 9 也是一個(gè)匹配項(xiàng)。

上面的表達(dá)式可以使用連字符 (-) 來(lái)表示:

/Chapter [^1-5]/

中括號(hào)表達(dá)式的典型用途是指定任何大寫或小寫字母或任何數(shù)字的匹配。下面的表達(dá)式指定這樣的匹配:

/[A-Za-z0-9]/

替換和分組

替換使用 | 字符來(lái)允許在兩個(gè)或多個(gè)替換選項(xiàng)之間進(jìn)行選擇。例如,可以擴(kuò)展章節(jié)標(biāo)題正則表達(dá)式,以返回比章標(biāo)題范圍更廣的匹配項(xiàng)。但是,這并不象您可能認(rèn)為的那樣簡(jiǎn)單。替換匹配 | 字符任一側(cè)最大的表達(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)來(lái)限制替換的范圍,即,確保它只應(yīng)用于兩個(gè)單詞 Chapter 和 Section。但是,括號(hào)也用于創(chuàng)建子表達(dá)式,并可能捕獲它們以供以后使用,這一點(diǎn)在有關(guān)反向引用的那一節(jié)講述。通過(guò)在上面的正則表達(dá)式的適當(dāng)位置添加括號(hào),就可以使該正則表達(dá)式匹配 Chapter 1 或 Section 3。

下面的正則表達(dá)式使用括號(hào)來(lái)組合 Chapter 和 Section,以便表達(dá)式正確地起作用:

/^(Chapter|Section) [1-9][0-9]{0,1}$/

盡管這些表達(dá)式正常工作,但 Chapter|Section 周圍的括號(hào)還將捕獲兩個(gè)匹配字中的任一個(gè)供以后使用。由于在上面的表達(dá)式中只有一組括號(hào),因此,只有一個(gè)被捕獲的"子匹配項(xiàng)"。

在上面的示例中,您只需要使用括號(hào)來(lái)組合單詞 Chapter 和 Section 之間的選擇。若要防止匹配被保存以備將來(lái)使用,請(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ù)搜索。

其他示例

下面列出一些正則表達(dá)式示例:

 正則表達(dá)式  描述
 /\b([a-z]+) \1\b/gi  一個(gè)單詞連續(xù)出現(xiàn)的位置。
 /(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/  匹配一個(gè) URL 解析為協(xié)議、域、端口及相對(duì)路徑。
 /^(?:Chapter|Section) [1-9][0-9]{0,1}$/  定位章節(jié)的位置。
 /[-a-z]/  a 至 z 共 26個(gè) 字母再加一個(gè) ?-? 號(hào)。
 /ter\b/  可匹配 chapter,而不能匹配 terminal。
 /\Bapt/  可匹配 chapter,而不能匹配 aptitude。
 /Windows(?=95 |98 |NT )/  可匹配 Windows95 或 Windows98 或 WindowsNT,當(dāng)找到一個(gè)匹配后,從 Windows 后面開(kāi)始進(jìn)行下一次的檢索匹配。
 /^\s*$/  匹配空行。
 /\d{2}-\d{5}/  驗(yàn)證由兩位數(shù)字、一個(gè)連字符再加 5 位數(shù)字組成的 ID 號(hào)。
 <[a-zA-Z]+.*?>([\s\S]*?)  匹配 HTML 標(biāo)記。

 正則表達(dá)式  描述
 hello  匹配 {hello}
 gray|grey  匹配 {gray, grey}
 gr(a|e)y  匹配 {gray, grey}
 gr[ae]y  匹配 {gray, grey}
 b[aeiou]bble  匹配 {babble, bebble, bibble, bobble, bubble}
 [b-chm-pP]at|ot  匹配 {bat, cat, hat, mat, nat, oat, pat, Pat, ot}
 colou?r  匹配 {color, colour}
 rege(x(es)?|xps?)  匹配 {regex, regexes, regexp, regexps}
 go*gle  匹配 {ggle, gogle, google, gooogle, goooogle, ...}
 go+gle  匹配 {gogle, google, gooogle, goooogle, ...}
 g(oog)+le  匹配 {google, googoogle, googoogoogle, googoogoogoogle, ...}
 z{3}  匹配 {zzz}
 z{3,6}  匹配 {zzz, zzzz, zzzzz, zzzzzz}
 z{3,}  匹配 {zzz, zzzz, zzzzz, ...}
 [Bb]rainf\*\*k  匹配 {Brainf**k, brainf**k}
 \d  匹配 {0,1,2,3,4,5,6,7,8,9}
 1\d{10}  匹配 11 個(gè)數(shù)字,以 1 開(kāi)頭
 [2-9]|[12]\d|3[0-6]  匹配 2 到 36 范圍內(nèi)的整數(shù)
 Hello\nworld  匹配 Hello 后跟換行符,后跟 world
 \d+(\.\d\d)?  包含一個(gè)正整數(shù)或包含兩位小數(shù)位的浮點(diǎn)數(shù)。
 [^*@#]  排除 *、@ 、# 三個(gè)特色符號(hào)
 //[^\r\n]*[\r\n]  匹配 // 開(kāi)頭的注釋
 ^dog  匹配以 "dog" 開(kāi)始
 dog$  匹配以 "dog" 結(jié)尾
 ^dog$  is exactly "dog"


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)