正則 規(guī)則
正則表達式 規(guī)則表達式
Regular Expression
弄一個正則:
new RegExp('表達式',['選項']);
字符串上面有兩個方法:
str.search(expr或字符串) //查找,搜索
在str中找,找字符串或表達式expr匹配的內(nèi)容,如果找到的話,
就返回第1個出現(xiàn)的位置,如果找不到,就返回-1
-- indexOf
var exp = new RegExp('A');
str.search(exp);
str.match(expr或字符串); //匹配
在str中匹配,按expr或字符串來匹配,如果能匹配到,
返回匹配結果的數(shù)組,如果匹配不到,返回 null
match方法,通常是配合正則表達式來使用。
正則中的選項:
g global 全局(在全局,在整個字符串中找,如果不加這個選項,那么只匹配一次)
var expr = new RegExp('A','g'); //在整個字符串中匹配 A
i ignore 忽略大小寫
new RegExp('a','gi'); //選項可以寫在一起,并且沒有選后順序
正則的簡寫:
不簡寫: var expr = new RegExp('a','gi');
簡寫:
/表達式/選項
var expr = /a/gi;
轉(zhuǎn)義:
字符串轉(zhuǎn)義: 換行 \n
\n 換行
\ 顯示一個
\\顯示兩個 \
正則里轉(zhuǎn)義:
\d 數(shù)字
正則的特性:
1、懶 g
var str = 'sdfd2332';
str.match(/\d/) --> 2
2、笨
var str = 'dss23 23fs fd2332s';
str.match(/\d/g); --> 2,3,2,3,2,3,3,2
解決笨: 量詞
正則里量詞:
+ 有一個或多個--- 最少有1個,最多不限
? 有0個或1個 -- 最少有0個,最多1個 —— 有或沒有
* 最少0個,最多不限 ——建議盡量少用,因為效率低
var str = 'dss23 23fs fd2332s';
str.match(/\d+/g); --> 23,23,2332
3、貪
var str = 'dss234566778876555678 23fs fd2332s';
str.match(/\d+/g);
正則特性: 懶 笨 貪
敏感詞過濾:好
思路:就是把一些預先設定好的詞匯,用來代替
字符串的方法:
str.replace('要替換的東西','替換成什么');
let str = '我們國家真好';
str.replace('國家','');
str.replace方法: 只能替換一次
*replace如果不配合正則使用,它就是一個廢物
str.replace('要替換的東西或正則','替換成什么');
str.replace('要替換的東西或正則','替換成什么字符串 或 自定義函數(shù)');
str.replace('a','b'); //把a替換成b了
str.replace('a',function(s){
//s 表示的就是每次匹配的結果
//返回值 返回的是什么,就替換成什么
});
正則中的或: |
小總結:
new RegExp(表達式,選項);
str.search
str.match
str.replace
懶 (會享受) 笨(萌) 貪(有追求)
正則中的修飾:
^ 行首 匹配的是一行第一個字符的前面
$ 行尾 匹配的是一行最后一個字符的后面
選項:
g 全局
i 忽略大小寫
m 多行模式 multi-line
^ 行首
$ 行尾
單行模式:匹配的整個字符串的開頭和結尾
多行模式:匹配的一行的開頭和結尾
選項:
g i m
/\d/gim
/\d/img
量詞:
{n} n個
{n,m} 最少n個,最多m個
{n,} 最少n個,最多不限
{0,1} 最少0個,最多1個—— ?
{0,} 最少0個,最多不限——*
{1,} 最少1個,最多不限——+
+ 最少1個,最多不限
* 最少0個,最多不限
? 最少0個,最多1個
正則中的 []:
1)或的關系
a[bce]c abc acc aec
2)范圍 [-]
[0-9] 從0到9
[a-z] 從a到z
[A-Z] 從A到Z
[a-zA-Z] a到z 或者 A到Z (大寫字母或小寫字母——所有字母)
[12-49] 1或 者2到4或者 9 (1,2,3,4,9)
年齡:滿18周歲 18-100歲
18
19
20-99
100
/[18-100]/ ×
把問題拆解,拆解一個一個的簡單問題(在這個例子,注意所有的東西都是字符)
要求: 18 19 20 21 ..... 100
解題:
18,19 : 1[89]
20-99: [2-9]\d
100: 100
(1[89]) | ([2-9]\d) | (100)
3)排除 [^]
排除[^xxx] ^ 后面的字符
a[^bc]d 第一個字符是a
第二個字符不能是 b,也不能是c
第三個字符是d
轉(zhuǎn)義:
\d 表示所有數(shù)字
\w 字母、數(shù)字、下劃線
\s 空白 (空格 換行 tab)
\D 非數(shù)字
\W 不是 字母、數(shù)字、下劃線 _
\S 不是空白
\b 單詞邊界(任何可以分隔單詞的東西)
***還有好多自己去看
str.search()
str.match()
正則對象.test('字符串')
var reg = new RegExp('\d+','g');
reg.test('sds232')
--如果不能匹配 ,返回 true
--如果能匹配,返回false
reg.test()
——有一些嚴重性問題,不太嚴謹
用test,需要在表達式的前后,加 ^ $
在正則中,如果使用 或(|) ,那么一定要加括號——每個條件和整體都加括號
例1:
驗證手機號:
整體11位
第一位:1 1
第二位:3,4,5,7,8 [34578]
剩余部分: \d{9}
1[34578]\d{9}
例2:
座機號
8723678
87232982
010-83232323
0423-3239325
規(guī)則:
區(qū)號 電話號
區(qū)號:
1)第1位 0
2)第2位不是0 [1-9]
2)第3位或第4位是數(shù)字 \d{1,2}
4)- 1個
整體上看,可有可無 ?
電話:
第1位不是0 [1-9]
6到7位數(shù)字 \d{6,7}
合: (0[1-9]\d{1,2}\-)?[1-9]\d{6,7})
例3:
郵箱:
zhanghaibin@zhinengshe.com
zhang@sina.com.cn
6181742@qq.com
zhang_1234@sohu.com
分為幾個部分:
郵箱的名字(@前面):
字母,數(shù)字,下劃線,最長20位
\w{1,20}
@
域名:
字母,數(shù)字,-
[a-zA-Z0-9\-]{1,10}
域名后綴:
.com
.cn
.com.cn
(\.[a-zA-Z]{2,3}){1,2}
合:\w{1,20}@[a-zA-Z0-9\-]{1,10}(\.[a-zA-Z]{2,3}){1,2}
關于字符串的幾個小方法:
indexOf lastIndexOf charAt substring toUpperCase toLowerCase split match search
1、去除首尾空格
jquery: $.trim('| s sds fds |')
原生: str.trim() —— 不支持低級瀏覽器
/^\s+|\s+$/g
2、ES6 判斷是否由小串開始
str.startsWith('abc'); 不兼容IE系
自己用正則實現(xiàn): /^abc/
3、ES6 判斷是否由小串結尾
str.endsWith('bd'); 不兼容IE系
自己用正則實現(xiàn):/bd$/