正則表達式是一種被用於匹配字符串的字符匹配模式。多用於表單驗證。正則表達式:regular expression,簡稱RegExp。javascript
字面量:用兩個/作界定符。通常會將字面量賦值給一個變量。java
var pattern = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
git
正則表達式可使用一些字符串方法或正則方法進行操做:正則表達式
字符串的方法:express
正則表達式方法:數組
若是沒有找到分隔符,那麼返回的數組包含的是一整個str組成元素的數組。若是分隔符爲空字符串「」,返回的是字符串每一個字符組成元素的數組。 返回值:由切割後的子字符串組成數組。能夠用來將用戶輸入的不規範的字符串轉爲正確的Array。bash
例:根據空格切割字符串:'aa bbb c dd eeeeee'函數
'aa bbb c dd eeeeee'.split(/\s+/); //["aa","bbb","c","dd","eeeeee"]
複製代碼
\s:表示空白字符;測試
+:表示前面的一個符號表明的字符能夠出現一次或者屢次ui
返回值:子串或正則匹配結果在父字符串中的第一次出現的位置的下標。search搜索只找到第一次搜索到的位置下標,因此全局標誌也就不起做用了。若是匹配的子串在父字符串中沒有對應的字符,返回結果就是-1.(能夠利用search匹配字符串有無在表格中進行關鍵字搜索,條件判斷是看是否等於-1)
function withSearch(str){
var newStr = "";
for(var i =0; i<str.length; i++){
if(newStr.search(str[i]) == -1){
newStr += str[i];
}
}
return newStr;
}
console.log(withSearch('abcdde')); //abcde
複製代碼
返回值:是由匹配結果組成的數組。和split同樣返回的是數組,可是match返回的是第一個匹配的子串,不過能夠應用全局標誌g,搜索所有。
在 'abbcccbbbbbddbbbdabbb' 中查詢重複 'b' 字符串
'abbcccbbbbbddbbbdabbb'.match(/b+/); //['bb']
複製代碼
返回值:是一個新的字符串,原始字符串不發生變化。若是第一個參數是字符串,那麼只會替換第一個子字符串;想要替換全部子串,只有一個辦法就是傳入reg,同時指定g標誌。
例:過濾字符串中空格:'aa b c d e f ' => "aabcdef" 使用全局界定符g進行全局匹配和替換。
str.replace(/\s+/g, ‘’); //用空字符串替換匹配的空白
複製代碼
參數:要查找的字符串。
exec方法即便在模式中設置了全局標誌g,每次也只會返回一個匹配項。在不設置g時,同一個str上屢次調用exec()都始終返回第一個匹配項;而設置了g,每次調用exec()都會在字符串中繼續查找新的匹配項,知道搜索到字符串末尾爲止。lastIndex在全局模式下回隨着調用而改變++。《高級程序設計》
test方法常常用在if判斷語句中做爲條件來使用。
判斷'aaddccddabcddeeddfff'是否包含'abc'字符串
/abc/.test('aaddccddabcddeeddfff'); //true
複製代碼
正則表達式的組成:由一些普通字符和一些特殊字符(又叫元字符--metacharacters)組成。普通字符包括大小寫的字母和數字,而元字符則具備特殊的含義。 特殊字符: javascript中經常使用正則的特殊字符有
( ) [ ] { } \ ^ $ | ? * + . 若想匹配這類字符必須用轉移符號 \ 如:\(,\^,\\
正則表達式中是一些普通字符組成,在進行字符串匹配時,須要進行精確匹配,好比/good/,匹配時,字符串中必須包含g,o,o,d四個字符,並且順序不能發生變化,中間也不容許出現其餘字符,也就是說必須包含」good」字符串。
預約義特殊字符:
\t /\t/製表符,縮進 eg: console.log(/\t/.test('’)),表示匹配一個縮進或製表符
\n /\n/回車符 eg: console.log(/\n/.test(
aaabbb
)); ,表示匹配一個回車換行
問題:""不能包裹一個包含回車換行的字符串。
解決方法:將引號換成數字1前面的``引號,就能夠包括回車。 \f /\f/換頁符 \b /\b/空格,表示匹配的是一個空格,\b能夠搭配字符匹配做爲邊界的查找標識符,在邊界處詳細講。
簡單類:正則的多個字符對應一個字符,咱們能夠用[]把它們括起來,讓[]這個總體對應一個字符 o[abc]z →oaz,obz,ocz
範圍類:有時匹配的東西過多,並且類型又相同,所有輸入太麻煩,咱們能夠在中間加了個橫線。 [a-z]、[0-9]、[A-Z]
組合類:容許用中括號匹配不一樣類型的單個字符[a-zA-Z0-9] [a-zA-Z_$][a-zA-Z0-9_$] 變量名的命名規則 [0-9a-z]:表示能夠匹配小寫字母或者數字。
負向類:[]內部最前面加個元字符^進行取反,表示匹配不能爲括號裏面的字符。 [^a]:表示只要不是a都能匹配成功。
g 全局修飾符,再查找時不會找到第一次結果後就結束,而是在找到全局範圍內全部結果後再結束。 global:全球的、全局的。 書寫位置:在正則符號的後面//g.
i 修飾符用於執行對大小寫不敏感的匹配。case-insensitive 書寫位置:在正則符號的後面//i
m表示多行模式,忽略換行。
^開頭注意不能緊跟於左中括號的後面 書寫位置:寫在//正則符號內部的開始位置,表示後面的字符必須匹配成功,並且須要做爲字符串的開頭。
$結尾 書寫位置:寫在//正則符號內部的結束位置,表示$前面的字符必須匹配成功,並且須要做爲字符串的結束。
\b單詞邊界,用於查找位於單詞的開頭或結尾的匹配。區間比^$要小,只做用在單詞。 \b會搭配其餘字符進行匹配,其餘字符必須先匹配成功,若是\ba,要先匹配一個a字符,還要求a位於一個單詞的開始位置,若是c\b,表示要匹配一個c字符,還要求c必須位於一個單詞的結尾。
\B非單詞邊界,用於查找不處在單詞的開頭或結尾的匹配。 \B也要搭配其餘符號進行匹配,表示前面後後面的匹配的字符,除了要匹配成功以外,還不能位於一個單詞的開頭或結尾。
本質就是將最經常使用的一些特殊類的字符集進行一個簡化書寫。
[^\n\r]除了換行和回車以外的任意字符 匹配:除了回車和換行以外其餘全部字符,好比數字、字母、漢字、特殊符號、空格、縮進等。
\d[0-9]數字字符(digital) 匹配:匹配一個任意的數字字符。
\D[^0-9]非數字字符 匹配:非數字字符,只要不是數字都能匹配成功
\s[ \t\n\x0B\f\r]空白字符(space) 匹配:能夠匹配全部的空白,包括縮進、回車、換行、空格、換頁。
\S[^ \t\n\x0B\f\r]非空白字符 匹配:表示全部非空白的字符,除了空白都能匹配。
\w[a-zA-Z_0-9]單詞字符(全部的字母/數字/下劃線) 匹配:全部的字母(大小寫)、數字、下劃線。
\W[^a-zA-Z_0-9]非單詞字符 匹配:除了數字、字母、下劃線,其餘都能匹配。
有時會遇到某個正則符號須要連續匹配屢次,能夠利用量詞進行次數描述。 使用{}包裹數字,表示前面的一個字符能夠出現多少次。
{n}硬性量詞對應零次或者n次 表示:n是幾,前面的符號須要連續出現對應的幾回。
{n,m}軟性量詞至少出現n次但不超過m次(中間不能有空格) 表示:前面的字符必須出現至少n次,最多不超過m次。
{n,}軟性量詞至少出現n次(+的升級版) 表示:前面的字符能夠出現n次及以上。
?{0,1}軟性量詞出現零次或一次
*{0,}軟性量詞出現零次或屢次(任意次)
+{1,}軟性量詞出現一次或屢次(至少一次)
量詞只能修飾前面的一個字符,不能直接修飾前面多個字符,想要操做多個要把想操做的字符串用小括號括起來。
可使用豎線(|)字符表示或者的關係。 若是沒有任何限制的狀況下,或操做符會將總體正則表達式分紅兩部分。 只要有一種狀況匹配成功都能返回true。
若是咱們想匹配a和c中匹配d或b,須要將d和b的或關係放在小括號內,縮小或操做符的範圍。
雖然量詞的出現,能幫助咱們處理一排密緊密相連的同類型字符。但這是不夠的,咱們用中括號表示範圍內選擇,大括號表示重複次數。若是想獲取重複多個字符,咱們就要用小括號進行分組了。 使用小括號分組後,就能夠對內部字符進行總體的控制。
反向引用標識是對正則表達式中的匹配組捕獲的子字符串進行編號,經過「\編號(在表達式中)」,「$編號(在表達式外)」進行引用。從1開始計數。
正則中若是有小括號的分組,會在字符串中找到匹配的子字符串,能夠將子字符串結果拿到正則中進行二次使用,或者正則表達式以外進行二次調用。 正則表達式中有多個小括號的話,按照編號1,2,3……進行編號,從左往右。exec test str的replace均可以使用這種方法
正則中:使用\1,反向使用子串1的結果。
正則外面:使用$1,反向使用子串1的結果。
字符串的replace方法的反向引用。 第一個參數:正則表達式,內部有小括號的話,能夠進行編號,按順序小括號分別對應第一小組,第二小組...。 第二個參數:能夠利用分組匹配結果,進行反向引用。
更經常使用的方式,給replace第二個參數設置爲一個替換函數。
1.函數的參數位置,第一個必須寫match,後面的參數可使用反向引用的編號$,$2……
2.函數必須有返回值,返回值的結果纔是替換字符串的內容。
function demo(str) {
var arr = str.split(''); //把字符串轉換爲數組
str = arr.sort().join('');
var value = ‘’; //用來存放出現最多的substr的中間變量
var index = 0; //用來存放最大長度
var re = /(\w)\1+/g; //
str.replace(re, function ($0, $1) {
//alert($0); 表明每次匹配成功的結果 : aa dd jj kk l sssssssssssssssss
//alert($1); 表明每次匹配成功的第一個子項,也就是\w: a d j k l s
if (index < $0.length) { //若是index保存的值小於$0的長度就進行下面的操做
index = $0.length; // 這樣index一直保存的就在最大的長度
value = $0; //value保存的是出現最多的這個字符
}
});
alert('最多的字符:' + value + ',重複的次數:' + index);
}
複製代碼
匹配中文:[\u4e00-\u9fa5]
網上的一些經常使用方法
var pattern = /^[a-zA-Z0-9_-]{4,16}$/;
複製代碼
var pattern = /^.*(?=.{6,})(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*? ]).*$/;
複製代碼
(?<= )是連在一塊兒的格式,不要把=單獨拿出。與之對應的格式是(?<! )。
(?<=\s*)\d+ 匹配的是 "abc 123abc""abc123abc"中的"123" 匹配的是:前面有"重複0次或多個空格"後面緊跟的是數字的數字部分; 注:匹配的字符串只有\d+,不包括\s*
(?=exp)也叫零寬度正預測先行斷言,它斷言自身出現的位置的後面能匹配表達式exp。 好比\b\w+(?=ing\b),匹配以 ing 結尾的單詞的前面部分(除了 ing 之外的部分),如查找 I'm singing while you're dancing.時,它會匹配 sing 和 danc。 (?<=exp)也叫零寬度正回顧後發斷言,它斷言自身出現的位置的前面能匹配表達式 exp。好比(?<=\bre)\w+\b 會匹配以re開頭的單詞的後半部分(除了 re之外的部分),例如在 查找reading a book時,它匹配ading。 假如你想要給一個很長的數字中每三位間加一個逗號(固然是從右邊加起了), 你能夠這 樣查找須要在前面和裏面添加逗號的部分:((?<=\d)\d{3})*\b,用它對 1234567890 進行查 找時結果是234567890。 下面這個例子同時使用了這兩種斷言:(?<=\s)\d+(?=\s)匹配以空白符間隔的數字(再次 強調,不包括這些空白符)
數字:^[0-9]+$
n位的數字:^\d{n}$
至少n位的數字:^\d{n,}$
m-n位的數字:^\d{m,n}$
零和非零開頭的數字:^(0|[1-9][0-9]*)$
非零開頭的最多帶兩位小數的數字:^([1-9][0-9]*)+(.[0-9]{1,2})?$
帶1-2位小數的正數或負數:^(-)?\d+(.\d{1,2})?$
正數、負數、和小數:^(-|+)?\d+(.\d+)?$
有兩位小數的正實數:^[0-9]+(.[0-9]{2})?$
有1~3位小數的正實數:^[0-9]+(.[0-9]{1,3})?$
非零的正整數:^[1-9]\d*$ 或 ^([1-9][0-9]){1,3}$ 或 ^+?[1-9][0-9]$
非零的負整數:^-[1-9][]0-9"$ 或 ^-[1-9]\d$
非負整數:^\d+$ 或 ^[1-9]\d*|0$
非正整數:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$
非負浮點數:^\d+(.\d+)?$ 或 ^[1-9]\d*.\d*|0.\d*[1-9]\d*|0?.0+|0$
非正浮點數:^((-\d+(.\d+)?)|(0+(.0+)?))$ 或 ^(-([1-9]\d*.\d*|0.\d*[1-9]\d*))|0?.0+|0$
正浮點數:^[1-9]\d*.\d*|0.\d*[1-9]\d*$ 或 ^(([0-9]+.[0-9][1-9][0-9])|([0-9][1-9][0-9].[0-9]+)|([0-9][1-9][0-9]))$
負浮點數:^-([1-9]\d*.\d*|0.\d*[1-9]\d*)$ 或 ^(-(([0-9]+.[0-9][1-9][0-9])|([0-9][1-9][0-9].[0-9]+)|([0-9][1-9][0-9])))$
浮點數:^(-?\d+)(.\d+)?$ 或 ^-?([1-9]\d*.\d*|0.\d*[1-9]\d*|0?.0+|0)$
漢字:^[\u4e00-\u9fa5]{0,}$
英文和數字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$
長度爲3-20的全部字符:^.{3,20}$
由26個英文字母組成的字符串:^[A-Za-z]+$
由26個大寫英文字母組成的字符串:^[A-Z]+$
由26個小寫英文字母組成的字符串:^[a-z]+$
由數字和26個英文字母組成的字符串:^[A-Za-z0-9]+$
由數字、26個英文字母或者下劃線組成的字符串:^\w+$ 或 ^\w{3,20}$
中文、英文、數字包括下劃線:^[\u4E00-\u9FA5A-Za-z0-9_]+$
中文、英文、數字但不包括下劃線等符號:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$
能夠輸入含有^%&',;=?$"等字符:[^%&',;=?$\x22]+
禁止輸入含有~的字符:[^~\x22]+
Email地址:^\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*$
域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
InternetURL:[a-zA-z]+://[^\s]* 或 ^http://([\w-]+.)+[\w-]+(/[\w-./?%&=]*)?$
手機號碼:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
電話號碼("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^((\d{3,4}-)|\d{3.4}-)?\d{7,8}$
國內電話號碼(0511-440522二、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}
身份證號(15位、18位數字):^\d{15}|\d{18}$
短身份證號碼(數字、字母x結尾):^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$
賬號是否合法(字母開頭,容許5-16字節,容許字母數字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
密碼(以字母開頭,長度在6~18之間,只能包含字母、數字和下劃線):^[a-zA-Z]\w{5,17}$
強密碼(必須包含大小寫字母和數字的組合,不能使用特殊字符,長度在8-10之間):^(?=.\d)(?=.[a-z])(?=.*[A-Z]).{8,10}$
日期格式:^\d{4}-\d{1,2}-\d{1,2}
一年的12個月(01~09和1~12):^(0?[1-9]|1[0-2])$
一個月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$
1到3個數字,後面跟着任意個 逗號+3個數字,逗號成爲可選,而不是必須:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$
備註:這就是最終結果了,別忘了"+"能夠用"*"替代若是你以爲空字符串也能夠接受的話(奇怪,爲何?)最後,別忘了在用函數時去掉去掉那個反斜槓,通常的錯誤都在這裏
xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\.[x|X][m|M][l|L]$
雙字節字符:[^\x00-\xff] (包括漢字在內,能夠用來計算字符串的長度(一個雙字節字符長度計2,ASCII字符計1))
空白行的正則表達式:\n\s*\r (能夠用來刪除空白行)
HTML標記的正則表達式:<(\S*?)[^>]>.?</\1>|<.*? />
首尾空白字符的正則表達式:^\s*|\s*$或(^\s*)|(\s*$) (能夠用來刪除行首行尾的空白字符(包括空格、製表符、換頁符等等),很是有用的表達式)
騰訊QQ號:[1-9][0-9]{4,} (騰訊QQ號從10000開始)
中國郵政編碼:[1-9]\d{5}(?!\d) (中國郵政編碼爲6位數字)
IP地址:\d+.\d+.\d+.\d+ (提取IP地址時有用)
IP地址:((?:(?:25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d?\d))