正則表達式是一個描述字符模式的對象。
JavaScript的RegExp對象和String對象定義了使用正則表達式來執行強大的模式匹配和文本檢索與替換函數的方法.javascript
在JavaScript中,正則表達式是由一個RegExp對象表示的.固然,可使用一個RegExp()構造函數來建立RegExp對象,也能夠用JavaScript 1.2中的新添加的一個特殊語法來建立RegExp對象.就像字符串直接量被定義爲包含在引號內的字符同樣,正則表達式直接量也被定義爲包含在一對斜槓(/)之間的字符.因此,JavaScript可能會包含以下的代碼:前端
var pattern = /s$/;java
這行代碼建立一個新的RegExp對象,並將它賦給變量parttern.這個特殊的RegExp對象和全部以字母"s"結尾的字符串都匹配.用RegExp()也能夠定義一個等價的正則表達式,代碼以下:正則表達式
var pattern = new RegExp("s$");express
不管是用正則表達式直接量仍是用構造函數RegExp(),建立一個RegExp對象都是比較容易的.較爲困難的任務是用正則表達式語法來描述字符的模式.JavaScript採用的是Perl語言正則表達式語法的一個至關完整的子集.後端
正則表達式的模式規範是由一系列字符構成的.大多數字符(包括全部字母數字字符)描述的都是按照字面意思進行匹配的字符.這樣說來,正則表達式/java/就和全部包含子串 "java" 的字符串相匹配.雖然正則表達式中的其它字符不是按照字面意思進行匹配的,但它們都具備特殊的意義.正則表達式 /s$/ 包含兩個字符.函數
第一個特殊字符 "s" 是按照字面意思與自身相匹配.第二個字符 "$" 是一個特殊字符,它所匹配的是字符串的結尾.因此正則表達式 /s$/ 匹配的就是以字母 "s" 結尾
的字符串.spa
1.直接量字符prototype
咱們已經發現了,在正則表達式中全部的字母字符和數字都是按照字面意思與自身相匹配的.JavaScript的正則表達式還經過以反斜槓(\)開頭的轉義序列支持某些非翻譯
字母字符.例如,序列 "\n" 在字符串中匹配的是一個直接量換行符.在正則表達式中,許多標點符號都有特殊的含義.下面是這些字符和它們的含義:
正則表達式的直接量字符
字符 匹配
________________________________
字母數字字符 自身
\ f 換頁符
\ n 換行符
\ r 回車
\ t 製表符
\ v 垂直製表符
\ / 一個 / 直接量
\ \ 一個 \ 直接量
\ . 一個 . 直接量
\ * 一個 * 直接量
\ + 一個 + 直接量
\ ? 一個 ? 直接量
\ | 一個 | 直接量
\ ( 一個 ( 直接量
\ ) 一個 ) 直接量
\ [ 一個 [ 直接量
\ ] 一個 ] 直接量
\ { 一個 { 直接量
\ } 一個 } 直接量
\ XXX 由十進制數 XXX 指 定的ASCII碼字符
\ Xnn 由十六進制數 nn 指定的ASCII碼字符
\ cX 控制字符^X. 例如, \cI等價於 \t, \cJ等價於 \n
___________________________________________________
若是想在正則表達式中使用特殊的標點符號,必須在它們以前加上一個 "\" .
2.字符類
將單獨的直接符放進中括號內就能夠組合成字符類.一個字符類和它所包含的任何一個字符都匹配,因此正則表達式 / [abc] / 和字母 "a" , "b" , "c" 中的任何一個都匹配.另外還能夠定義否認字符類,這些類匹配的是除那些包含在中括號以內的字符外的全部字符.定義否認字符尖時,要將一個 ^ 符號做爲從左中括號算起的第一個字符.正則表達式的集合是 / [a-zA-z0-9] / .
因爲某些字符類很是經常使用,因此JavaScript的正則表達式語法包含一些特殊字符和轉義序列來表示這些經常使用的類.例如, \s 匹配的是空格符,製表符和其它空白符, \s匹配的則是空白符以外的任何字符.
正則表灰式的字符類
字符 匹配
____________________________________________________
[...] 位於括號以內的任意字符
[^...] 不在括號之中的任意字符
. 除了換行符以外的任意字符,等價於[^\n]
\w 任何單字字符, 等價於[a-zA-Z0-9]
\W 任何非單字字符,等價於[^a-zA-Z0-9]
\s 任何空白符,等價於[\ t \ n \ r \ f \ v]
\S 任何非空白符,等價於[^\ t \ n \ r \ f \ v]
\d 任何數字,等價於[0-9]
\D 除了數字以外的任何字符,等價於[^0-9]
[\b] 一個退格直接量(特例)
________________________________________________________________
3.複製
用以上的正則表式的語法,能夠把兩位數描述成 / \ d \ d /,把四位數描述成 / \d \ d \ d \ d /.但咱們尚未一種方法能夠用來描述具備任意多數位的數字或者是一個
字符串.這個串由三個字符以及跟隨在字母以後的一位數字構成.這些複雜的模式使用的正則表達式語法指定了該表達式中每一個元素要重複出現的次數.
指定複製的字符老是出如今它們所做用的模式後面.因爲某種複製類型至關經常使用.因此有一些特殊的字符專門用於表示它們.例如: +號匹配的就是複製前一模式一次或屢次的模式.下面的表列出了複製語法.先看一個例子:
/\d{2, 4}/ //匹配2到4間的數字.
/\w{3} \d?/ //匹配三個單字字符和一個任意的數字.
/\s+java\s+/ //匹配字符串"java" ,而且該串先後能夠有一個或多個空格.
/[^"] * / //匹配零個或多個非引號字符.
正則表達式的複製字符
字符 含義
__________________________________________________________________
{n, m} 匹配前一項至少n次,可是不能超過m次
{n, } 匹配前一項n次,或者屢次
{n} 匹配前一項剛好n次
? 匹配前一項0次或1次,也就是說前一項是可選的. 等價於 {0, 1}
+ 匹配前一項1次或屢次,等價於{1,}
* 匹配前一項0次或屢次.等價於{0,}
___________________________________________________________________
4.選擇,分組和引用
正則表達式的語法還包括指定選擇項,對子表達式分組和引用前一子表達式的特殊字符.字符| 用於分隔供選擇的字符.例如: /ab|cd|ef/ 匹配的是字符串 "ab",或者是字符串 "cd",又或者 "ef". /\d{3}|[a-z]{4}/ 匹配的是要麼是一個三位數,要麼是四個小寫字母.在正則表達式中括號具備幾種做用.它的主要做用是把單獨的項目分組成子表達式,以即可以像處理一個獨立的單元那種用 *、+或? 來處理那些項目.例如: /java(script) ?/ 匹配的是字符串 "java",其後既能夠有 "script",也能夠沒有. /(ab|cd) + |ef) / 匹配的既能夠是字符串 "ef",也能夠是字符串"ab" 或者 "cd" 的一次或屢次重複.
在正則表達式中,括號的第二個用途是在完整的模式中定義子模式。當一個正則表達式成功地和目標字符串相匹配時,能夠從目標串中抽出和括號中的子模式相匹配的部分.例如,假定咱們正在檢索的模式是一個或多個字母后面跟隨一位或多位數字,那麼咱們可使用模式 / [a-z] + \ d+/.可是因爲假定咱們真正關心的是每一個匹配尾部的數字,那麼若是咱們將模式的數字部分放在括號中 (/ [a-z] + (\d+)/) ,咱們就能夠從所檢索到的任何匹配中抽取數字了,以後咱們會對此進行解析的.
代括號的子表達式的另外一個用途是,容許咱們在同一正則表達式的後面引用前面的子表達式.這是經過在字符串 \ 後加一位或多位數字來實現的.數字指的是代括號的子表達式在正則表達式中的位置.例如: \1 引用的是第一個代括號的子表達式. \3 引用的是第三個代括號的子表達式.注意,因爲子表達式能夠嵌套在其它子表達式中,因此它的位置是被計數的左括號的位置.
例如:在下面的正則表達式被指定爲 \2:
/([Jj]ava([Ss]cript)) \sis \s (fun\w*) /
對正則表達式中前一子表達式的引用所指定的並非那個子表達式的模式,而是與那個模式相匹配的文本.這樣,引用就不僅是幫助你輸入正則表達式的重複部分的快捷方式了,它還實施了一條規約,那就是一個字符串各個分離的部分包含的是徹底相同的字符.例如:下面的正則表達式匹配的就是位於單引號或雙引號以內的全部字符.可是,它要求開始和結束的引號匹配(例如兩個都是雙引號或者都是單引號):
/[' "] [^ ' "]*[' "]/
若是要求開始和結束的引號匹配,咱們可使用以下的引用:
/( [' "] ) [^ ' "] * \1/
\1匹配的是第一個代括號的子表達式所匹配的模式.在這個例子中,它實施了一種規約,那就是開始的引號必須和結束的引號相匹配.注意,若是反斜槓後跟隨的數字比代括號的子表達式數多,那麼它就會被解析爲一個十進制的轉義序列,而不是一個引用.你能夠堅持使用完整的三個字符來表示轉義序列,這們就能夠避免混淆了.例如,使用 \044,而不是\44.下面是正則表達式的選擇、分組和引用字符:
字符 含義
______________________________________
| 選擇.匹配的要麼是該符號左邊的子表達式,要麼它右邊的子表達式
(...) 分組.將幾個項目分爲一個單元.這個單元可由 *、+、?和|等符號使用,並且還能夠記住和這個組匹配的字符以供此後引用使用
\n 和第n個分組所匹配的字符相匹配.分組是括號中的子表達式(多是嵌套的).分組號是從左到右計數的左括號數
______________________________________
5.指定匹配的位置
咱們已經看到了,一個正則表達式中的許多元素纔可以匹配字符串的一個字符.例如: \s 匹配的只是一個空白符.還有一些正則表達式的元素匹配的是字符之間寬度爲0的空間,而不是實際的字符例如: \b 匹配的是一個詞語的邊界,也就是處於一個/w字字符和一個\w非字字符之間的邊界.像\b 這樣的字符並不指定任何一個匹配了的字符串中的字符,它們指定的是匹配所發生的合法位置.有時咱們稱這些元素爲正則表達式的錨.由於它們將模式定位在檢索字符串中的一個特定位置.最經常使用的錨元素是 ^, 它使模式依賴於字符串的開頭,而錨元素$則使模式定位在字符串的末尾.
例如:要匹配詞 "javascript" ,咱們可使用正則表達式 /^ javascript $/. 若是咱們想檢索 "java" 這個詞自身 (不像在 "javascript" 中那樣做爲前綴),那麼咱們可使用模式 /\s java \s /, 它要求在詞語java以前和以後都有空格.可是這樣做有兩個問題.第一: 若是 "java" 出如今一個字符的開頭或者是結尾.該模式就不會與之匹配,除非在開頭和結尾處有一個空格. 第二: 當這個模式找到一個與之匹配的字符時,它返回的匹配的字符串前端和後端都有空格,這並非咱們想要的.所以,咱們使用詞語的邊界 \b 來代替真正的空格符 \s 進行匹配. 結果表達式是 /\b java \b/.
下面是正則表達式的錨字符:
字符 含義
____________________________________________________________________
^ 匹配的是字符的開頭,在多行檢索中,匹配的是一行的開頭
$ 匹配的是字符的結尾,在多行檢索中,匹配的是一行的結尾
\b 匹配的是一個詞語的邊界.簡而言之就是位於字符\w 和 \w之間的位置(注意:[\b]匹配的是退格符)
\B 匹配的是非詞語的邊界的字符
_____________________________________________________________________
6.屬性
有關正則表達式的語法還有最後一個元素,那就是正則表達式的屬性,它說明的是高級模式匹配的規則.和其它正則表達式語法不一樣,屬性是在 / 符號以外說明的.即它們不出如今兩個斜槓之間,而是位於第二個斜槓以後.javascript 1.2支持兩個屬性.屬性 i 說明模式匹配應該是大小寫不敏感的.屬性 g 說明模式匹配應該是全局的.也就是說,應該找出被檢索的字符串中全部的匹配.這兩種屬性聯合起來就能夠執行一個全局的,大小寫不敏感的匹配.
例如: 要執行一個大小不敏感的檢索以找到詞語 "java" (或者是 "java" 、"JAVA"等) 的第一個具體值,咱們可使用大小不敏感的正則表達式 /\b java\b/i .若是要在一個字符串中找到 "java" 全部的具體值,咱們還能夠添加屬性 g, 即 /\b java \b/gi .
如下是正則表達式的屬性:
字符 含義
_________________________________________
i 執行大小寫不敏感的匹配
g 執行一個全局的匹配,簡而言之,就是找到全部的匹配,而不是在找到第一個以後就中止了
_________________________________________
除屬性 g 和 i 以外,正則表達式就沒有其它像屬性同樣的特性了.若是將構造函數 RegExp 的靜態屬性 multiline 設置爲 true ,那麼模式匹配將以多行的模式進行.在這種模式下,錨字符 ^ 和 $ 匹配的不僅是檢索字符串的開頭和結尾,還匹配檢索字符串內部的一行的開頭和結尾.例如: 模式 /Java$/ 匹配的是 "Java",可是並不匹配"Java\nis fun" .若是咱們設置了 multiline 屬性,那麼後者也將被匹配:
RegExp.multiline = true;
正則表達式(regular expression)對象包含一個正則表達式模式(pattern)。它具備用正則表達式模式去匹配或代替一個串(string)中特定字符(或字符集合)的屬性(properties)和方法(methods)。要爲一個單獨的正則表達式添加屬性,可使用正則表達式構造函數(constructor function),不管什麼時候被調用的預設置的正則表達式擁有靜態的屬性(the predefined RegExp object has static properties that are set whenever any regular expression is used, 我不知道我翻得對不對,將原文列出,請自行翻譯)。
建立:
一個文本格式或正則表達式構造函數
文本格式: /pattern/flags
正則表達式構造函數: new RegExp("pattern"[,"flags"]);
參數說明:
pattern -- 一個正則表達式文本
flags -- 若是存在,將是如下值:
g: 全局匹配
i: 忽略大小寫
gi: 以上組合
[注意] 文本格式的參數不用引號,而在用構造函數時的參數須要引號。如:/ab+c/i new RegExp("ab+c","i")是實現同樣的功能。在構造函數中,一些特殊字符須要進行轉意(在特殊字符前加"\")。如:re = new RegExp("\\w+")
正則表達式中的特殊字符
字符 含意
\ 作爲轉意,即一般在"\"後面的字符不按原來意義解釋,如/b/匹配字符"b",當b前面加了反斜杆後/\b/,轉意爲匹配一個單詞的邊界。
-或-
對正則表達式功能字符的還原,如"*"匹配它前面元字符0次或屢次,/a*/將匹配a,aa,aaa,加了"\"後,/a\*/將只匹配"a*"。
^ 匹配一個輸入或一行的開頭,/^a/匹配"an A",而不匹配"An a"
$ 匹配一個輸入或一行的結尾,/a$/匹配"An a",而不匹配"an A"
* 匹配前面元字符0次或屢次,/ba*/將匹配b,ba,baa,baaa
+ 匹配前面元字符1次或屢次,/ba*/將匹配ba,baa,baaa
? 匹配前面元字符0次或1次,/ba*/將匹配b,ba
(x) 匹配x保存x在名爲$1...$9的變量中
x|y 匹配x或y
{n} 精確匹配n次
{n,} 匹配n次以上
{n,m} 匹配n-m次
[xyz] 字符集(character set),匹配這個集合中的任一一個字符(或元字符)
[^xyz] 不匹配這個集合中的任何一個字符
[\b] 匹配一個退格符
\b 匹配一個單詞的邊界
\B 匹配一個單詞的非邊界
\cX 這兒,X是一個控制符,/\cM/匹配Ctrl-M
\d 匹配一個字數字符,/\d/ = /[0-9]/
\D 匹配一個非字數字符,/\D/ = /[^0-9]/
\n 匹配一個換行符
\r 匹配一個回車符
\s 匹配一個空白字符,包括\n,\r,\f,\t,\v等
\S 匹配一個非空白字符,等於/[^\n\f\r\t\v]/
\t 匹配一個製表符
\v 匹配一個重直製表符
\w 匹配一個能夠組成單詞的字符(alphanumeric,這是個人意譯,含數字),包括下劃線,如[\w]匹配"$5.98"中的5,等於[a-zA-Z0-9]
\W 匹配一個不能夠組成單詞的字符,如[\W]匹配"$5.98"中的$,等於[^a-zA-Z0-9]。
說了這麼多了,咱們來看一些正則表達式的實際應用的例子:
E-mail地址驗證:
function test_email(strEmail) {
var myReg = /^[_a-z0-9]+@([_a-z0-9]+\.)+[a-z0-9]{2,3}$/;
if(myReg.test(strEmail)) return true;
return false;
}
HTML代碼的屏蔽
function mask_HTMLCode(strInput) {
var myReg = /<(\w+)>/;
return strInput.replace(myReg, "<$1>");
}
正則表達式對象的屬性及方法
預約義的正則表達式擁有有如下靜態屬性:input, multiline, lastMatch, lastParen, leftContext, rightContext和$1到$9。其中input和multiline能夠預設置。其餘屬性的值在執行過exec或test方法後被根據不一樣條件賦以不一樣的值。許多屬性同時擁有長和短(perl風格)的兩個名字,而且,這兩個名字指向同一個值。(JavaScript模擬perl的正則表達式)
正則表達式對象的屬性 屬性 含義
$1...$9 若是它(們)存在,是匹配到的子串
$_ 參見input
$* 參見multiline
$& 參見lastMatch
$+ 參見lastParen
$` 參見leftContext
$’ 參見rightContext
constructor 建立一個對象的一個特殊的函數原型
global 是否在整個串中匹配(bool型)
ignoreCase 匹配時是否忽略大小寫(bool型)
input 被匹配的串
lastIndex 最後一次匹配的索引
lastParen 最後一個括號括起來的子串
leftContext 最近一次匹配以左的子串
multiline 是否進行多行匹配(bool型)
prototype 容許附加屬性給對象
rightContext 最近一次匹配以右的子串
source 正則表達式模式
lastIndex 最後一次匹配的索引
正則表達式對象的方法方法 含義 compile 正則表達式比較 exec 執行查找 test 進行匹配 toSource 返回特定對象的定義(literal representing),其值可用來建立一個新的對象。重載Object.toSource方法獲得的。 toString 返回特定對象的串。重載Object.toString方法獲得的。 valueOf 返回特定對象的原始值。重載Object.valueOf方法獲得 例子 將輸出"Smith, John"