就是一個規(guī)則效拭,用來處理字符串的一個規(guī)則(正則就是用來處理字符串的)
- API
* test
* 判斷一個字符串是否符合我們制定的規(guī)則 reg.test(str); 返回布爾值
* exec
* 把字符串中符合我們正則的內(nèi)容捕捉到 res=reg.exec('12345a123') 返回匹配到的內(nèi)容
正則的元字符和簡單應用
每個正則表達式都是由元字符和修飾符組成的
- 常用的元字符
\ 轉(zhuǎn)譯字符
^ 以某個元字符開始
$ 以某個元字符結(jié)尾
* 出現(xiàn)0次到多次
+ 出現(xiàn)一次到多次
? 出現(xiàn)0次或1次
{n} 出現(xiàn)N次
{n,} 出現(xiàn)至少N次
{n,m} 出現(xiàn)N次到M次
. 除了\n
() 分組把一個大正則劃分成幾個小正則
X|Y X或Y的一個
[XYZ] XYZ中的一個
[^XYZ] 除了XYZ
[A-Z] A-Z中的一個
[^A-Z] 除了A-Z之間的任意一個
\d 一個0--9之間的數(shù)字
\b 一個邊界符 單詞兩邊的空格 邊界
\w 數(shù)字 字母 下劃線 任意一個字符
\s 匹配一個空白字符 空格 換行符 換頁符等
- 常用的修飾符
* g 全局匹配
* i 不區(qū)分大小寫
* m 多行匹配
懶惰性和貪婪性
- 正則的捕捉
exec
捕捉的內(nèi)容格式
* 捕捉的內(nèi)容是一個數(shù)組
* 數(shù)組的第一項是當前正則捕獲
* index 捕獲內(nèi)容在字符串中開始的索引位置
* input 捕捉的原始字符串
* 每一次捕捉的時候都是進行默認的匹配按灶,如果沒有匹配成功的 捕獲的結(jié)果是null 只有匹配到的內(nèi)容才會捕捉到
- 正則捕捉的特點
懶惰性--就是只會找一處婴谱,找到一處就不在找了
- 每一次執(zhí)行exec只能捕獲一個匹配的內(nèi)容佩耳,在不進行處理的情況下润绎,再執(zhí)行多次捕獲匙铡,捕獲的還是一個匹配的內(nèi)容
- lastIndex:是正則每一次捕捉在字符串中開始查找到額位置拧咳,默認值是0伯顶,每一次捕捉都是從字符串0索引開始查找
- 解決正則的懶惰性----在正則的末尾加修飾符’g‘
var reg=/\d+/g
var res=reg.exec('12345a123');
var arr=[]
while(res){
arr.push(res[0])
res=reg.exec('12345a123')
}
arr //["12345", "123"]
res //null 因為查到最后一個沒有了就是null
- 注:字符串中的match方法
- 把所有和正則匹配的字符都獲取到
- 雖然在當前情況下match會比exec更簡便,但是match存在一些自己處理不了的問題骆膝,在分組情況下祭衩,match只能捕獲大正則匹配的內(nèi)容
- 而對于小正則匹配的內(nèi)容是無法獲取的
貪婪性--正則的每次捕獲都是按照最長的結(jié)果捕獲的
解決正則的貪婪性---在量詞元字符后面添加一個?即可
- 阅签? 在正則中的作用
<1>放在普通元字符后邊表示出現(xiàn)0--1次
<2>/\d?/ 表示數(shù)字可能出現(xiàn)也可能不出現(xiàn)
<3>放在一個量詞后邊是取消捕捉時候的貪婪性
<4>小正則 (?:)職匹配不捕獲
正則分組 掐暮、
*正則內(nèi) \1 代表復制分組的第一個小正則
- 正則分組作用
* 1. 改變優(yōu)先級
* 2. 分組引用
* 3. \2代表和第2個分組一模一樣,\1代表和第1個分組一模一樣政钟。路克。。
* var reg=/^(\w)\1(\w)\2/ console.log(reg.test('wwcc')) ---->true
分組捕獲
- 正則捕獲的時候不僅僅把大正則匹配的內(nèi)容捕獲得到 還可以吧小正則匹配的內(nèi)容捕捉到
* var reg=/^(\d{2})(\d{4})/
* var str='123456'
* var arg=reg.exec(str);
* arg[0] 大正則匹配的內(nèi)容
* arg[1] 小正則第一個分組匹配的內(nèi)容
正則分組捕獲.png
字符串的方法 replace养交、RegExp.$1得到第一分組內(nèi)容
- 將原有的字符串換成新的字符精算,在不是用正則的情況下,每執(zhí)行一次替換一處
* replace 第一項的值是一個正則碎连,實現(xiàn)原理 * 首先和exec一樣灰羽,把所有和我們正則匹配的 都捕獲到,然后把捕獲的內(nèi)容替換成我們需要替換的新內(nèi)容 * str=str.replace(/ba/g,function(){ console.log(arguments);//每一次arguments的值和/ba/g.exec(str)獲取的值是一樣的 利用argument可以拿到分組中的所有內(nèi)容鱼辙,為我所用 return bawuzhan; //把匹配到的都替換為return的東西 * }) * 返回一個替換后的新字符串 * 解釋: * 1.匿名函數(shù)執(zhí)行多少次廉嚼,取決于正則在字符串中捕獲多少次 * 2.每一次執(zhí)行匿名函數(shù),里面?zhèn)鬟f的參數(shù)值arguments和通過exec捕獲到的結(jié)果非常相似 * (即使正則有分組倒戏,我們同樣可以通過arguments獲取分組捕獲的內(nèi)容) * 3.return 返回的結(jié)果是啥前鹅,就相當于這一次大正則 捕獲的內(nèi)容替換成返回的內(nèi)容 * arguments[0]每一次執(zhí)行匿名函數(shù)都可以把替換內(nèi)容獲取到 * arguments[1]每一次執(zhí)行匿名函數(shù),正則捕獲到第一個小正則的內(nèi)容
*RegExp.$1 獲取第一個小正則分組內(nèi)容
正則應用
- 將小寫數(shù)字換成中文數(shù)字
var strList=['零','壹','貳','叁','肆','伍','陸','柒','捌','玖']
var num='8962738';
num=num.replace(/\d/g,function(){
if(arguments[0]) {
return strList[arguments[0]];
}
})
console.log(num)
- 獲取一個字符串中出現(xiàn)最多次數(shù)的字符和出現(xiàn)的次數(shù)
var str='拉拉手哈哈啊啊啊哈阿是哦掃啊啊手啊啊';
var obj={};
str.replace(/\S/g,function(){
var val=arguments[0];
obj[val]>=1?obj[val]+=1:obj[val]=1
})
console.log(obj)
or
for(var i=0;i<str.length;i++){
var cur=str[i];
console.log(cur)
if(obj[cur]>=1){
obj[cur]++;
}else{
obj[cur]=1;
}
}
console.log(obj)
var max=0;
for(var k in obj){
if(obj[k]>max){
max=obj[k];
}
}
console.log(max);
var ary=[];
for(var key in obj){
obj[key]==max?ary.push(key):null;
}
console.log(ary);
- 把url中的參數(shù)都獲取到 并且保存成一個對象
var obj={};
var reg=/([^?=&]+)=([^?=&]+)/g;
str.replace(reg, function () {
obj[arguments[1]]=arguments[2]
})
console.log(obj)
- 時間字符串格式化
String.prototype.myFormatTime=function(){
var reg=/^(\d{4})(?:-|\/|\.|:)(\d{1,2})(?:-|\/|\.|:)(\d{1,2})(?:\s+)(\d{1,2})(?:-|\/|\.|:)(\d{1,2})(?:-|\/|\.|:)(\d{1,2})$/g;
// (?:-|\/|\.|:) 表示匹配但是不捕獲 - \ . : 這幾個分隔符
var ary=[];
this.replace(reg,function(){
ary=([].slice.call(arguments)).slice(1,7);//獲取小分組的時間
})
var format=arguments[0]||'{0}年{1}月{2}日 {3}:{4}:{5}';
return format.replace(/{(\d+)}/g,function(){
var val=ary[arguments[1]];
return val.length==1?"0"+val:val
})
}
var str ="2017.5.18 14:53:0";
console.log(str.myFormatTime('{0}年{1}月'))
console.log(str.myFormatTime('{0}/{1}/{2} {3}:{4}:{5}'));
console.log(str.myFormatTime('{0}-{1}-{2} {3}:{4}:{5}'));
console.log(str.myFormatTime());
常用的正則
//正整數(shù)
/^[0-9]*[1-9][0-9]*$/;
//負整數(shù)
/^-[0-9]*[1-9][0-9]*$/;
//正浮點數(shù)
/^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$/;
//負浮點數(shù)
/^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$/;
//浮點數(shù)
/^(-?\d+)(\.\d+)?$/;
//email地址
/^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/;
//url地址
/^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$/;
或:^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$
//年/月/日(年-月-日峭梳、年.月.日)
/^(19|20)\d\d[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])$/;
//匹配中文字符
/[\u4e00-\u9fa5]/;
//匹配帳號是否合法(字母開頭舰绘,允許5-10字節(jié)蹂喻,允許字母數(shù)字下劃線)
/^[a-zA-Z][a-zA-Z0-9_]{4,9}$/;
//匹配空白行的正則表達式
/\n\s*\r/;
//匹配中國郵政編碼
/[1-9]\d{5}(?!\d)/;
//匹配身份證
/\d{15}|\d{18}/;
//匹配國內(nèi)電話號碼
/(\d{3}-|\d{4}-)?(\d{8}|\d{7})?/;
//匹配IP地址
/((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)/;
//匹配首尾空白字符的正則表達式
/^\s*|\s*$/;
//匹配HTML標記的正則表達式
< (\S*?)[^>]*>.*?|< .*? />;
//sql 語句
^(select|drop|delete|create|update|insert).*$
//提取信息中的網(wǎng)絡鏈接
(h|H)(r|R)(e|E)(f|F) *= *('|")?(\w|\\|\/|\.)+('|"| *|>)?
//提取信息中的郵件地址
\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
//提取信息中的圖片鏈接
(s|S)(r|R)(c|C) *= *('|")?(\w|\\|\/|\.)+('|"| *|>)?
//提取信息中的 IP 地址
(\d+)\.(\d+)\.(\d+)\.(\d+)
//取信息中的中國手機號碼
(86)*0*13\d{9}
//提取信息中的中國郵政編碼
[1-9]{1}(\d+){5}
//提取信息中的浮點數(shù)(即小數(shù))
(-?\d*)\.?\d+
//提取信息中的任何數(shù)字
(-?\d*)(\.\d+)?
//電話區(qū)號
^0\d{2,3}$
//騰訊 QQ 號
^[1-9]*[1-9][0-9]*$
//帳號(字母開頭,允許 5-16 字節(jié)捂寿,允許字母數(shù)字下劃線)
^[a-zA-Z][a-zA-Z0-9_]{4,15}$
//中文口四、英文、數(shù)字及下劃線
^[\u4e00-\u9fa5_a-zA-Z0-9]+$