什么是正則?
正則表達式(regular expression)是一個描述字符規(guī)則的對象神汹±可以用來檢查一個字符串是否含有某個字符丰榴,將匹配的字符做替換或者從某個字符串中取出某個條件的子串等。
unicode編碼中文監(jiān)測:/^[\u2E80-\u9FFF]+$/
正則表達式: 字符串按照某種規(guī)則進行匹配
優(yōu)點: 可以極大的簡化驗證字符串,和修改字符串
每一個語言都有正則表達式, 但是每個語言的正則表達式都有區(qū)別
正則的創(chuàng)建方式:
1.構造函數方式
var reg1 = new RegExp("a");
var str = "adassdfsd";
console.log(str.match(reg1)) //輸出匹配a的字符
2.字面量方式他宛,古老的perl語言風格
var reg2 = /a/;
console.log(str2.match(reg2)); //輸出匹配a的字符
正則表達式組成部分
-
修飾符
- g 全局匹配
- i 字母不區(qū)分大小寫
- m 區(qū)分多行
-
元字符
.
匹配除了(\n)換行符以外的任意字符
\
轉義符
\d
0-9的數字
\D
非數字
\w
字母船侧, 數字, _
\s
匹配空字符
\b
匹配邊緣
^
開始符號(在[]里表示非)
$
結束符號
-
量詞元字符
*
0次或者多次
+
至少一次
?
0次或者1次
{m}
m次
{m, n}
m次到n次
{m,}
至少m次
[abc]
a、b厅各、c的其中一個
-> [a-z]
-> [a-zA-Z0-9]
a|b a或者b選一個
()
分組
正則表達式的兩個方法
-
test()
檢測字符串是否符合正則表達式的規(guī)則镜撩, 如果符合返回true,不符合返回false -
exec()
字符串捕獲, 通過正則表達式,獲取字符串的內容
懶惰性: 找到一個滿足的條件队塘,后面不在繼續(xù)經行尋找
貪婪性: 把一次滿足條件的結果一下返回
var reg = /\d+/;
var str = '2018/06/20';
console.dir(reg)
var arr = reg.exec(str);
// reg.lastIndex = 0;
console.log(arr);
arr = reg.exec(str);
console.log(arr);
console.dir(reg)
arr = reg.exec(str);
console.log(arr);
console.dir(reg)
arr = reg.exec(str);
console.log(arr);
console.dir(reg)
arr = reg.exec(str);
console.log(arr);
// lastindex: 開次的位置袁梗, 每次查詢完畢后, 記錄這一次最后的位置憔古。
// 當捕獲的內容為null時遮怜, lastindex會重置。
// 注意://g 不是捕獲不到結果,就證明字符串是錯的. 因為正常捕獲的話, 總有一次會得到null
// 字符串中的應用.
var str = '我TmD真棒鸿市, 我TmD真棒,我TmD真棒';
console.log(str.replace(/TmD/g, '****'));
// replace()
// search() 功能跟indexOf一樣, 只不過可以支持正則表達式
var str = '我TmD真棒锯梁, 我TmD真棒,我TmD真棒';
str.search('T');
// match() //從字符串中匹配內容
// 正則表達式不添加g修飾符": 和exec 一模一樣
// 添加修飾符g: 返回所有的匹配結果
// var str = '今天是2019年, 1月14日';
// var arr = str.match(/\d+/g);
var dateStr = '2018/05/27 8:24:36';
var dateArr = dateStr.match(/\d+/g);
var date = ['年', '月', '日', '時', '分', '秒'];
var str = '';
//[] "2018", "05", "27", "8", "24", "36"]
dateArr.forEach(function(x, index) {
str += x + date[index];
})
console.log(str);
表達式全集
字符 | 描述 |
---|---|
\ | 將下一個字符標記為一個特殊字符、或一個原義字符焰情、或一個向后引用陌凳、或一個八進制轉義符。例如内舟,“n”匹配字符“n”合敦。“\n”匹配一個換行符验游。串行“\”匹配“\”而“(”則匹配“(”充岛。 |
^ | 匹配輸入字符串的開始位置。如果設置了RegExp對象的Multiline屬性批狱,^也匹配“\n”或“\r”之后的位置裸准。 |
$ | 匹配輸入字符串的結束位置。如果設置了RegExp對象的Multiline屬性赔硫,$也匹配“\n”或“\r”之前的位置炒俱。 |
* | 匹配前面的子表達式零次或多次。例如爪膊,zo能匹配“z”以及“zoo”权悟。等價于{0,}。 |
+ | 匹配前面的子表達式一次或多次推盛。例如峦阁,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”耘成。+等價于{1,}榔昔。 |
? | 匹配前面的子表達式零次或一次驹闰。例如,“do(es)?”可以匹配“does”或“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?”加派。請注意在逗號和兩個數之間不能有空格。 |
? | /^([a-z0-9_.-]+)@([\da-z.-]+).([a-z.]{2,6})$/ 當該字符緊跟在任何一個其他限制符(*,+,?跳芳,{n}芍锦,{n,},{n,m})后面時飞盆,匹配模式是非貪婪的娄琉。非貪婪模式盡可能少的匹配所搜索的字符串,而默認的貪婪模式則盡可能多的匹配所搜索的字符串吓歇。例如孽水,對于字符串“oooo”,“o+?”將匹配單個“o”城看,而“o+”將匹配所有“o”女气。 |
. | 匹配除“\n”之外的任何單個字符。要匹配包括“\n”在內的任何字符测柠,請使用像“(.|\n)”的模式炼鞠。 |
(pattern) | 匹配pattern并獲取這一匹配缘滥。所獲取的匹配可以從產生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中則使用 |
(?:pattern) | 匹配pattern但不獲取匹配結果,也就是說這是一個非獲取匹配凹耙,不進行存儲供以后使用姿现。這在使用或字符“(|)”來組合一個模式的各個部分是很有用。例如“industr(?:y|ies)”就是一個比“industry|industries”更簡略的表達式肖抱。 |
(?=pattern) | 正向肯定預查备典,在任何匹配pattern的字符串開始處匹配查找字符串。這是一個非獲取匹配意述,也就是說提佣,該匹配不需要獲取供以后使用。例如荤崇,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”拌屏,但不能匹配“Windows3.1”中的“Windows”。預查不消耗字符术荤,也就是說倚喂,在一個匹配發(fā)生后,在最后一次匹配之后立即開始下一次匹配的搜索瓣戚,而不是從包含預查的字符之后開始端圈。 |
(?!pattern) | 正向否定預查,在任何不匹配pattern的字符串開始處匹配查找字符串子库。這是一個非獲取匹配舱权,也就是說,該匹配不需要獲取供以后使用仑嗅。例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”宴倍,但不能匹配“Windows2000”中的“Windows”。預查不消耗字符无畔,也就是說啊楚,在一個匹配發(fā)生后,在最后一次匹配之后立即開始下一次匹配的搜索浑彰,而不是從包含預查的字符之后開始 |
(?<=pattern) | 反向肯定預查恭理,與正向肯定預查類擬,只是方向相反郭变。例如颜价,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”涯保,但不能匹配“3.1Windows”中的“Windows”。 |
(?<!pattern) | 反向否定預查周伦,與正向否定預查類擬夕春,只是方向相反。例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”专挪,但不能匹配“2000Windows”中的“Windows”及志。 |
x|y | 匹配x或y。例如寨腔,“z|food”能匹配“z”或“food”速侈。“(z|f)ood”則匹配“zood”或“food”迫卢。 |
[xyz] | 字符集合倚搬。匹配所包含的任意一個字符。例如乾蛤,“[abc]”可以匹配“plain”中的“a”每界。 |
[^xyz] | 負值字符集合。匹配未包含的任意字符家卖。例如眨层,“[^abc]”可以匹配“plain”中的“p”。 |
[a-z] | 字符范圍篡九。匹配指定范圍內的任意字符谐岁。例如,“[a-z]”可以匹配“a”到“z”范圍內的任意小寫字母字符榛臼。 |
[^a-z] | 負值字符范圍伊佃。匹配任何不在指定范圍內的任意字符。例如沛善,“[^a-z]”可以匹配任何不在“a”到“z”范圍內的任意字符航揉。 |
\b | 匹配一個單詞邊界,也就是指單詞和空格間的位置金刁。例如帅涂,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”尤蛮。 |
\B | 匹配非單詞邊界媳友。“er\B”能匹配“verb”中的“er”产捞,但不能匹配“never”中的“er”醇锚。 |
\cx | 匹配由x指明的控制字符。例如,\cM匹配一個Control-M或回車符焊唬。x的值必須為A-Z或a-z之一恋昼。否則,將c視為一個原義的“c”字符赶促。 |
\d | 匹配一個數字字符液肌。等價于[0-9]。 |
\D | 匹配一個非數字字符鸥滨。等價于[^0-9]嗦哆。 |
\f | 匹配一個換頁符。等價于\x0c和\cL爵赵。 |
\n | 匹配一個換行符吝秕。等價于\x0a和\cJ。 |
\r | 匹配一個回車符空幻。等價于\x0d和\cM。 |
\s | 匹配任何空白字符容客,包括空格秕铛、制表符、換頁符等等缩挑。等價于[ \f\n\r\t\v]但两。 |
\S | 匹配任何非空白字符。等價于[^ \f\n\r\t\v]供置。 |
\t | 匹配一個制表符谨湘。等價于\x09和\cI。 |
\v | 匹配一個垂直制表符芥丧。等價于\x0b和\cK紧阔。 |
\w | 匹配包括下劃線的任何單詞字符。等價于“[A-Za-z0-9_]”续担。 |
\W | 匹配任何非單詞字符擅耽。等價于“[^A-Za-z0-9_]”。 |
\xn | 匹配n物遇,其中n為十六進制轉義值乖仇。十六進制轉義值必須為確定的兩個數字長。例如询兴,“\x41”匹配“A”乃沙。“\x041”則等價于“\x04&1”诗舰。正則表達式中可以使用ASCII編碼警儒。. |
\num | 匹配num,其中num是一個正整數始衅。對所獲取的匹配的引用冷蚂。例如缭保,“(.)\1”匹配兩個連續(xù)的相同字符。 |
\n | 標識一個八進制轉義值或一個向后引用蝙茶。如果\n之前至少n個獲取的子表達式艺骂,則n為向后引用。否則隆夯,如果n為八進制數字(0-7)钳恕,則n為一個八進制轉義值。 |
\nm | 標識一個八進制轉義值或一個向后引用蹄衷。如果\nm之前至少有nm個獲得子表達式忧额,則nm為向后引用。如果\nm之前至少有n個獲取愧口,則n為一個后跟文字m的向后引用睦番。如果前面的條件都不滿足,若n和m均為八進制數字(0-7)耍属,則\nm將匹配八進制轉義值nm托嚣。 |
\nml | 如果n為八進制數字(0-3),且m和l均為八進制數字(0-7)厚骗,則匹配八進制轉義值nml示启。 |
\un | 匹配n,其中n是一個用四個十六進制數字表示的Unicode字符领舰。例如夫嗓,\u00A9匹配版權符號(?)。 |