關於正則表達正則表達式
正則表達式(Regular Expression)是一種文本模式,包括普通字符(例如,a 到 z 之間的字母)和特殊字符(稱爲"元字符")。express
正則表達式是由普通字符(例如字符 a 到 z)以及特殊字符(稱爲"元字符")組成的文字模式。數組
普通字符函數
普通字符包括沒有顯式指定爲元字符的全部可打印和不可打印字符。這包括全部大寫和小寫字母、全部數字、全部標點符號和一些其餘符號。this
不可打印的字符:spa
\n 匹配一個換行符。等價於 \x0a 和 \cJ。code
\r 匹配一個回車符。等價於 \x0d 和 \cM。對象
\s 匹配任何空白字符,包括空格、製表符、換頁符等等。等價於 [ \f\n\r\t\v]。ip
\S 匹配任何非空白字符。等價於 [^ \f\n\r\t\v]。element
\t 匹配一個製表符。等價於 \x09 和 \cI。
所謂特殊字符,就是一些有特殊含義的字符,
特別字符 描述
$ 匹配輸入字符串的結尾位置。若是設置了 RegExp 對象的 Multiline 屬性,則 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符自己,請使用 \$。
( ) 標記一個子表達式的開始和結束位置。子表達式能夠獲取供之後使用。要匹配這些字符,請使用 \( 和 \)。
* 匹配前面的子表達式零次或屢次。要匹配 * 字符,請使用 \*。
+ 匹配前面的子表達式一次或屢次。要匹配 + 字符,請使用 \+。
. 匹配除換行符 \n 以外的任何單字符。要匹配 . ,請使用 \. 。
[ 標記一箇中括號表達式的開始。要匹配 [,請使用 \[。
? 匹配前面的子表達式零次或一次,或指明一個非貪婪限定符。要匹配 ? 字符,請使用 \?。
\ 將下一個字符標記爲或特殊字符、或原義字符、或向後引用、或八進制轉義符。例如, 'n' 匹配字符 'n'。'\n' 匹配換行符。序列 '\\' 匹配 "\",而 '\(' 則匹配 "("。
^ 匹配輸入字符串的開始位置,除非在方括號表達式中使用,此時它表示不接受該字符集合。要匹配 ^ 字符自己,請使用 \^。
{ 標記限定符表達式的開始。要匹配 {,請使用 \{。
| 指明兩項之間的一個選擇。要匹配 |,請使用 \|。
限定符用來指定正則表達式的一個給定組件必需要出現多少次才能知足匹配。有 * 或 + 或 ? 或 {n} 或 {n,} 或 {n,m} 共6種。
正則表達式的限定符有:
字符 描述
* 匹配前面的子表達式零次或屢次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等價於{0,}。
+ 匹配前面的子表達式一次或屢次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等價於 {1,}。
? 匹配前面的子表達式零次或一次。例如,"do(es)?" 能夠匹配 "do" 或 "does" 中的"do" 。? 等價於 {0,1}。
{n} n 是一個非負整數。匹配肯定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',可是能匹配 "food" 中的兩個 o。
{n,} n 是一個非負整數。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的全部 o。'o{1,}' 等價於 'o+'。'o{0,}' 則等價於 'o*'。
{n,m} m 和 n 均爲非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 將匹配 "fooooood" 中的前三個 o。'o{0,1}' 等價於 'o?'。請注意在逗號和兩個數之間不能有空格。
{n} Exactly n of the preceding element. (只能匹配連續n個字符)
e.g.
.{4} 匹配除了「.」以外的任意連續的4個字符。
例如:
var data = "13558036231";var data1 = data.replace(/.{4}/g,"****");
console.log(data1);// ********231;
a{2},會匹配aa
{n,} n or more of the preceding element.(能夠匹配n,或任意大於n個連續字符。貪婪匹配,會盡可能匹配多的字符)
e.g
a{2,},會匹配aa, aaa,aa... 等等
{m,n} Between m and n of the preceding element.(能夠匹配n到m個連續字符,貪婪匹配,連續n個字符比連續m個字符優先匹配)
e.g
a{2,4} 只會匹配aa,aaa,aaaa三種狀況
/[0-9]{3}\s[0-9]{4}\s[0-9]{4}/g.test("012 1223 2222"); true
/1[0-9]{2}\s[0-9]{4}\s[0-9]{4}/g.test("012 1223 2222");
x|y
匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 則匹配 "zood" 或 "food"。
[xyz]
字符集合。匹配所包含的任意一個字符。例如, '[abc]' 能夠匹配 "plain" 中的 'a'。
[^xyz]
負值字符集合。匹配未包含的任意字符。例如, '[^abc]' 能夠匹配 "plain" 中的'p'、'l'、'i'、'n'。
[a-z]
字符範圍。匹配指定範圍內的任意字符。例如,'[a-z]' 能夠匹配 'a' 到 'z' 範圍內的任意小寫字母字符。
[^a-z]
負值字符範圍。匹配任何不在指定範圍內的任意字符。例如,'[^a-z]' 能夠匹配任何不在 'a' 到 'z' 範圍內的任意字符。
^once
這個模式包含一個特殊的字符^,表示該模式只匹配那些以once開頭的字符串。
bucket$
這個模式與"Who kept all of this cash in a bucket"匹配,與"buckets"不匹配。字符^和$同時使用時,表示精確匹配(字符串與模式同樣)。例如:
^bucket$
只匹配字符串"bucket"。若是一個模式不包括^和$,那麼它與任何包含該模式的字符串匹配。例如:模式
once
與字符串
There once was a man from NewYork
Who kept all of his cash in a bucket.
是匹配的。
[a-z] 能夠用來匹配任意位置上的小寫字母: "...a..."
^[a-z] 只能匹配以小寫字母爲行首的行: "a..."
[a-z]$ 只能匹配以小寫字母爲行尾的行: "...a"
^[a-z]$ 應該只能匹配只有一個小寫字母的行: "a"
這個模式與任何元音字符匹配,但只能表示一個字符。用連字號能夠表示一個字符的範圍,如:
[a-z] //匹配全部的小寫字母
[A-Z] //匹配全部的大寫字母
[a-zA-Z] //匹配全部的字母
[0-9] //匹配全部的數字
[0-9\.\-] //匹配全部的數字,句號和減號
[ \f\r\t\n] //匹配全部的白字符
[^a-z] //除了小寫字母之外的全部字符
[^\\\/\^] //除了(\)(/)(^)以外的全部字符
[^\"\'] //除了雙引號(")和單引號(')以外的全部字符
\s |
匹配任何不可見字符,包括空格、製表符、換頁符等等。等價於[ \f\n\r\t\v]。 |
\S |
匹配任何可見字符。等價於[^ \f\n\r\t\v]。 |
\w |
匹配包括下劃線的任何單詞字符。相似但不等價於「[A-Za-z0-9_]」,這裏的"單詞"字符使用Unicode字符集。(即匹配數字,字母,下劃線) |
\W |
匹配任何非單詞字符。等價於「[^A-Za-z0-9_]」。 |
\d(匹配全部的數字)
匹配一個數字字符。等價於[0-9]。grep 要加上-P,perl正則支持
\D
匹配一個非數字字符。等價於[^0-9]。grep要加上-P,perl正則支持
舉例:zhangsan-001@gmail.com
分析郵件名稱部分:
根據以上條件得出郵件名稱表達式:[a-zA-Z0-9_-]+
分析域名部分:
通常域名的規律爲「[N級域名][三級域名.]二級域名.頂級域名」,好比「qq.com」、「www.qq.com」、「mp.weixin.qq.com」、「12-34.com.cn」,分析可得域名相似「** .** .** .**」組成。
綜上所述,域名部分能夠表示爲[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+
最終表達式:
因爲郵箱的基本格式爲「名稱@域名」,須要使用「^」匹配郵箱的開始部分,用「$」匹配郵箱結束部分以保證郵箱先後不能有其餘字符,因此最終郵箱的正則表達式爲:
^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$
舉例:楊元慶001Abc@lenovo.com.cn
分析郵件名稱部分:
分析郵件域名部分
郵件部分能夠參考實例1中的分析域名部分。
得出域名部分的表達式爲[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+。
最終表達式:
咱們用@符號將郵箱的名稱和域名拼接起來,所以完整的郵箱表達式爲
^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$
/正則表達式主體/修飾符(可選)
正則表達式修飾符
修飾符 能夠在全局搜索中不區分大小寫:
修飾符 描述
i 執行對大小寫不敏感的匹配。
g 執行全局匹配(查找全部匹配而非在找到第一個匹配後中止)。
m 執行多行匹配。
var str = string.replace(/\s/g,");去除字符串中的空格。
正則表達式模式
方括號用於查找某個範圍內的字符:
表達式 描述
[abc] 查找方括號之間的任何字符。
[0-9] 查找任何從 0 至 9 的數字。
(x|y) 查找任何以 | 分隔的選項。
元字符是擁有特殊含義的字符:
元字符 描述
\d 查找數字。
\s 查找空白字符。
\b 匹配單詞邊界。
\uxxxx 查找以十六進制數 xxxx 規定的 Unicode 字符。
量詞:
量詞 描述
n+ 匹配任何包含至少一個 n 的字符串。
n* 匹配任何包含零個或多個 n 的字符串。
n? 匹配任何包含零個或一個 n 的字符串。
var patt = /runoob/i
/runoob/i 是一個正則表達式。
runoob 是一個正則表達式主體 (用於檢索)。
i 是一個修飾符 (搜索不區分大小寫)。
使用字符串方法
在 JavaScript 中,正則表達式一般用於兩個字符串方法 : search() 和 replace()。
search() 方法 用於檢索字符串中指定的子字符串,或檢索與正則表達式相匹配的子字符串,並返回子串的起始位置。
replace() 方法 用於在字符串中用一些字符替換另外一些字符,或替換一個與正則表達式匹配的子串。
使用正則表達式搜索 "Runoob" 字符串,且不區分大小寫:
var str = "Visit Runoob!";
var n = str.search(/Runoob/i);//使用正則的形式,返回子字符串所在的起始位置
var n = str.search("Runoob");//使用字符串形式
輸出結果爲:
6
使用正則表達式且不區分大小寫將字符串中的 Microsoft 替換爲 Runoob :
var str = document.getElementById("demo").innerHTML;
var txt = str.replace(/microsoft/i,"Runoob");//使用正則替換
var txt = str.replace("Microsoft","Runoob");//使用字符串替換
結果輸出爲:
Visit Runoob!
使用 RegExp 對象
在 JavaScript 中,RegExp 對象是一個預約義了屬性和方法的正則表達式對象。
使用 test()
test() 方法是一個正則表達式方法。
test() 方法用於檢測一個字符串是否匹配某個模式,若是字符串中含有匹配的文本,則返回 true,不然返回 false。
如下實例用於搜索字符串中的字符 "e":
1.var patt = /e/;
patt.test("The best things in life are free!");
2.var patt1=new RegExp("e");
document.write(patt1.test("The best things in life are free"));
字符串中含有 "e",因此該實例輸出爲:
true
你能夠不用設置正則表達式的變量,以上兩行代碼能夠合併爲一行:
/e/.test("The best things in life are free!")
使用 exec()
exec() 方法是一個正則表達式方法。
exec() 方法用於檢索字符串中的正則表達式的匹配。
該函數返回一個數組,其中存放匹配的結果。若是未找到匹配,則返回值爲 null。
如下實例用於搜索字符串中的字母 "e":
1./e/.exec("The best things in life are free!");
2.var patt1=new RegExp("e");
document.write(patt1.exec("The best things in life are free"));
字符串中含有 "e",因此該實例輸出爲:
e
[a-z] 能夠用來匹配任意位置上的小寫字母: "...a..."
^[a-z] 只能匹配以小寫字母爲行首的行: "a..."
[a-z]$ 只能匹配以小寫字母爲行尾的行: "...a"
^[a-z]$ 應該只能匹配只有一個小寫字母的行: "a"
^[0-9]+abc$
^ 爲匹配輸入字符串的開始位置。
[0-9]+匹配多個數字, [0-9] 匹配單個數字,+ 匹配一個或者多個。
abc$匹配字母 abc 並以 abc 結尾,$ 爲匹配輸入字符串的結束位置。
var str = "123abc";
var patt1 = /^[0-9]+abc$/;
document.write(str.match(patt1));
123abc //得到匹配的表達式
正則表達式(regular expression)描述了一種字符串匹配的模式(pattern),能夠用來檢查一個串是否含有某種子串、將匹配的子串替換或者從某個串中取出符合某個條件的子串等。
例如:
runoo+b,能夠匹配 runoob、runooob、runoooooob 等,+ 號表明前面的字符必須至少出現一次(1次或屢次)。
runoo*b,能夠匹配 runob、runoob、runoooooob 等,* 號表明前面的字符能夠不出現,也能夠出現一次或者屢次(0次、或1次、或屢次)。
colou?r 能夠匹配 color 或者 colour,? 問號表明前面的字符最多隻能夠出現一次(0次、或1次)
正則表達式是由普通字符(例如字符 a 到 z)以及特殊字符(稱爲"元字符")組成的文字模式。
JavaScript RegExp 對象
var patt=new RegExp(pattern,modifiers);
或更簡單的方法
var patt=/pattern/modifiers;
模式描述了一個表達式模型。
修飾符(modifiers)描述了檢索是不是全局,區分大小寫等。
注意:當使用構造函數創造正則對象時,須要常規的字符轉義規則(在前面加反斜槓 \)。好比,如下是等價的:
var re = new RegExp("\\w+");
var re = /\w+/;
全文查找和不區分大小寫搜索 "is"
var str="Is this all there is?"; var patt1=/is/gi;
如下 標記的文本是得到的匹配的表達式:
Is this all there is?
test()
test()方法搜索字符串指定的值,根據結果並返回真或假。
下面的示例是從字符串中搜索字符 "e" :
實例
var patt1=new RegExp("e");
document.write(patt1.test("The best things in life are free"));
因爲該字符串中存在字母 "e",以上代碼的輸出將是:
true
當使用構造函數創造正則對象時,須要常規的字符轉義規則(在前面加反斜槓 \)
實例
var re = new RegExp("\\w+");
exec()
exec() 方法檢索字符串中的指定值。返回值是被找到的值。若是沒有發現匹配,則返回 null。
下面的示例是從字符串中搜索字符 "e" :
var patt1=new RegExp("e");
document.write(patt1.exec("The best things in life are free"));
因爲該字符串中存在字母 "e",以上代碼的輸出將是:
e