正則表達式的最簡單形式是在搜索字符串中匹配其本身的單個普通字符。例如,單字符模式,如 A,不論出現(xiàn)在搜索字符串中的何處,它總是匹配字母 A。下面是一些單字符正則表達式模式的示例:
/a/
/7/
/M/
可以將許多單字符組合起來以形成大的表達式。例如,以下正則表達式組合了單字符表達式:a、7 和 M。
/a7M/
請注意,沒有串聯(lián)運算符。只須在一個字符后面鍵入另一個字符。
句點 (.) 匹配字符串中的各種打印或非打印字符,只有一個字符例外。這個例外就是換行符 (\n)。下面的正則表達式匹配 aac、abc、acc、adc 等等,以及 a1c、a2c、a-c 和 a#c:
/a.c/
若要匹配包含文件名的字符串,而句點 (.) 是輸入字符串的組成部分,請在正則表達式中的句點前面加反斜杠 (\) 字符。舉例來說明,下面的正則表達式匹配 filename.ext:
/filename\.ext/
這些表達式只讓您匹配"任何"單個字符??赡苄枰ヅ淞斜碇械奶囟ㄗ址M。例如,可能需要查找用數(shù)字表示的章節(jié)標題(Chapter 1、Chapter 2 等等)。
用戶名可以包含以下幾種字符:
用戶名由若干個字母、數(shù)字、下劃線和中劃線組成,所以需要用到 + 表示 1 次或多次出現(xiàn)。
根據(jù)以上條件得出用戶名的表達式可以為:
[a-zA-Z0-9_-]+
var str = "abc123-_def";
var patt = /[a-zA-Z0-9_-]+/;
document.write(str.match(patt));
以下標記的文本是獲得的匹配的表達式:
abc123-_def
如果不需要中劃線則為:
[a-zA-Z0-9_]+
var str = "abc123def";
var str2 = "abc123_def";
var patt = /[a-zA-Z0-9_]+/;
document.write(str.match(patt));
document.write(str2.match(patt));
以下標記的文本是獲得的匹配的表達式:
abc123def
abc123_def
若要創(chuàng)建匹配字符組的一個列表,請在方括號([ 和 ])內(nèi)放置一個或更多單個字符。當字符括在中括號內(nèi)時,該列表稱為"中括號表達式"。與在任何別的位置一樣,普通字符在中括號內(nèi)表示其本身,即,它在輸入文本中匹配一次其本身。大多數(shù)特殊字符在中括號表達式內(nèi)出現(xiàn)時失去它們的意義。不過也有一些例外,如:
括在中括號表達式中的字符只匹配處于正則表達式中該位置的單個字符。以下正則表達式匹配 Chapter 1、Chapter 2、Chapter 3、Chapter 4 和 Chapter 5:
/Chapter [12345]/
請注意,單詞 Chapter 和后面的空格的位置相對于中括號內(nèi)的字符是固定的。中括號表達式指定的只是匹配緊跟在單詞 Chapter 和空格后面的單個字符位置的字符集。這是第九個字符位置。
若要使用范圍代替字符本身來表示匹配字符組,請使用連字符 (-) 將范圍中的開始字符和結(jié)束字符分開。單個字符的字符值確定范圍內(nèi)的相對順序。下面的正則表達式包含范圍表達式,該范圍表達式等效于上面顯示的中括號中的列表。
/Chapter [1-5]/
當以這種方式指定范圍時,開始值和結(jié)束值兩者都包括在范圍內(nèi)。注意,還有一點很重要,按 Unicode 排序順序,開始值必須在結(jié)束值的前面。
若要在中括號表達式中包括連字符,請采用下列方法之一:
[\-]
[-a-z]
[a-z-]
[!--]
[!-~]
若要查找不在列表或范圍內(nèi)的所有字符,請將插入符號 (^) 放在列表的開頭。如果插入字符出現(xiàn)在列表中的其他任何位置,則它匹配其本身。下面的正則表達式匹配1、2、3、4 或 5 之外的任何數(shù)字和字符:
/Chapter [^12345]/
在上面的示例中,表達式在第九個位置匹配 1、2、3、4 或 5 之外的任何數(shù)字和字符。這樣,例如,Chapter 7 就是一個匹配項,Chapter 9 也是一個匹配項。
上面的表達式可以使用連字符 (-) 來表示:
/Chapter [^1-5]/
中括號表達式的典型用途是指定任何大寫或小寫字母或任何數(shù)字的匹配。下面的表達式指定這樣的匹配:
/[A-Za-z0-9]/
替換使用 | 字符來允許在兩個或多個替換選項之間進行選擇。例如,可以擴展章節(jié)標題正則表達式,以返回比章標題范圍更廣的匹配項。但是,這并不象您可能認為的那樣簡單。替換匹配 | 字符任一側(cè)最大的表達式。
您可能認為,下面的表達式匹配出現(xiàn)在行首和行尾、后面跟一個或兩個數(shù)字的 Chapter 或 Section:
/^Chapter|Section [1-9][0-9]{0,1}$/
很遺憾,上面的正則表達式要么匹配行首的單詞 Chapter,要么匹配行尾的單詞 Section 及跟在其后的任何數(shù)字。如果輸入字符串是 Chapter 22,那么上面的表達式只匹配單詞 Chapter。如果輸入字符串是 Section 22,那么該表達式匹配 Section 22。
若要使正則表達式更易于控制,可以使用括號來限制替換的范圍,即,確保它只應(yīng)用于兩個單詞 Chapter 和 Section。但是,括號也用于創(chuàng)建子表達式,并可能捕獲它們以供以后使用,這一點在有關(guān)反向引用的那一節(jié)講述。通過在上面的正則表達式的適當位置添加括號,就可以使該正則表達式匹配 Chapter 1 或 Section 3。
下面的正則表達式使用括號來組合 Chapter 和 Section,以便表達式正確地起作用:
/^(Chapter|Section) [1-9][0-9]{0,1}$/
盡管這些表達式正常工作,但 Chapter|Section 周圍的括號還將捕獲兩個匹配字中的任一個供以后使用。由于在上面的表達式中只有一組括號,因此,只有一個被捕獲的"子匹配項"。
在上面的示例中,您只需要使用括號來組合單詞 Chapter 和 Section 之間的選擇。若要防止匹配被保存以備將來使用,請在括號內(nèi)正則表達式模式之前放置 ?:。下面的修改提供相同的能力而不保存子匹配項:
/^(?:Chapter|Section) [1-9][0-9]{0,1}$/
除 ?: 元字符外,兩個其他非捕獲元字符創(chuàng)建被稱為"預(yù)測先行"匹配的某些內(nèi)容。正向預(yù)測先行使用 ?= 指定,它匹配處于括號中匹配正則表達式模式的起始點的搜索字符串。反向預(yù)測先行使用 ?! 指定,它匹配處于與正則表達式模式不匹配的字符串的起始點的搜索字符串。
例如,假設(shè)您有一個文檔,該文檔包含指向 Windows 3.1、Windows 95、Windows 98 和 Windows NT 的引用。再進一步假設(shè),您需要更新該文檔,將指向 Windows 95、Windows 98 和 Windows NT 的所有引用更改為 Windows 2000。下面的正則表達式(這是一個正向預(yù)測先行的示例)匹配 Windows 95、Windows 98 和 Windows NT:
/Windows(?=95 |98 |NT )/
找到一處匹配后,緊接著就在匹配的文本(不包括預(yù)測先行中的字符)之后搜索下一處匹配。例如,如果上面的表達式匹配 Windows 98,將在 Windows 之后而不是在 98 之后繼續(xù)搜索。
下面列出一些正則表達式示例:
正則表達式 | 描述 |
/\b([a-z]+) \1\b/gi | 一個單詞連續(xù)出現(xiàn)的位置。 |
/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/ | 匹配一個 URL 解析為協(xié)議、域、端口及相對路徑。 |
/^(?:Chapter|Section) [1-9][0-9]{0,1}$/ | 定位章節(jié)的位置。 |
/[-a-z]/ | a 至 z 共 26個 字母再加一個 ?- ? 號。 |
/ter\b/ | 可匹配 chapter,而不能匹配 terminal。 |
/\Bapt/ | 可匹配 chapter,而不能匹配 aptitude。 |
/Windows(?=95 |98 |NT )/ | 可匹配 Windows95 或 Windows98 或 WindowsNT,當找到一個匹配后,從 Windows 后面開始進行下一次的檢索匹配。 |
/^\s*$/ | 匹配空行。 |
/\d{2}-\d{5}/ | 驗證由兩位數(shù)字、一個連字符再加 5 位數(shù)字組成的 ID 號。 |
<[a-zA-Z]+.*?>([\s\S]*?) | 匹配 HTML 標記。 |
正則表達式 | 描述 |
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 個數(shù)字,以 1 開頭 |
[2-9]|[12]\d|3[0-6] | 匹配 2 到 36 范圍內(nèi)的整數(shù) |
Hello\nworld | 匹配 Hello 后跟換行符,后跟 world |
\d+(\.\d\d)? | 包含一個正整數(shù)或包含兩位小數(shù)位的浮點數(shù)。 |
[^*@#] | 排除 *、@ 、# 三個特色符號 |
//[^\r\n]*[\r\n] | 匹配 // 開頭的注釋 |
^dog | 匹配以 "dog" 開始 |
dog$ | 匹配以 "dog" 結(jié)尾 |
^dog$ | is exactly "dog" |
更多建議: