我們已經會熟練使用js字符串類型了,例如你想知道一個變量是否等于一個字符串,可能可能這樣判斷
if(a=='hello,world'){...
}
復制代碼
但是往往我們有時候對一些字符串判斷顯得力不從心,例如判斷一個文件的類型是否為js類型,可能有下面幾種文件名格式
1, hello.js
2, js.hello
3, hellojs
4, helljso
復制代碼
以我們人腦的認知來看,我們一眼能夠看出只有第一個符合我們的要求,但是我們怎么寫這個判斷程序呢?例如我們可以這樣判斷,例如js字符串方法,從右邊往左邊取三位,如果為‘.js’則匹配成功。 但是我問一下如果文件名描述為hello..js呢?顯然,這種方法不太適合,所以需要正則表達式來進行精確匹配了。 正則表達式用于描述一種特征,就例如你描述某某女生長得怎么樣一樣。例如瓜子臉,一米六到一米七,長頭發... 同理我們可以使用正則表達式來描述我們需要的字符,例如郵箱格式:
一串數字或者字母+@+字符串或者數字+'.'+'數字或者字符串'
復制代碼
我們怎么用代碼來描述我們的這個對象呢,我們可以使用例如下面的寫法
var a=/hello/i
或者
var a = new RegExp('hello',i);
復制代碼
/ / 之間寫入你的匹配規則 后面加一個修飾符i 或者g或者m
i表示忽略大小寫,即人為HELLO和hello是一樣的
g表示全局,多用在匹配和搜索中,我們先暫且不管。
m表示多行匹配
復制代碼
我們首先學會怎么描述規則,即怎么寫/ /之間的規則 對于某種特征一般有一下幾種關系。
- 精確的。例如字符為'hello'的,只需/hello/即可,如果你接收HELLO,即/hello/i即可
- 含有,例如0-9之間
- 范圍加限定長度,例如我需要匹配長度為4的0-9之間數字
- 邊界的,例如 結尾為.js 或者開頭為020-的電話格式
對于我們是否寫對了規則,我們可以用test()方法試一試 test()好比一面照妖鏡
var a=/hello/i
console.log(a.test('heelo') //false
復制代碼
說明heelo和a不匹配,是個假的。 下面分別說明上述幾種
- 包含[],這種關系類似于數學之中排列組合,例如[abc],代表a,b,c所能組成的各種組合
let a=/[0-9]/;
console.log(a.test(9)) //true
console.log(a.test(90)) //true
console.log(a.test('90')) //true
console.log(a.test('90SS')) //true
console.log(a.test('ABCD')) //falselet b=/[0]/;
console.log(b.test(9)) //fasle
console.log(b.test(90)) //true
復制代碼
let a=/[abc]/;
console.log(a.test('a')) //true
console.log(a.test('ac')) //true
console.log(a.test('abc')) //true
console.log(a.test('ABCD')) //false
復制代碼
let a=/[*&$]/;
console.log(a.test('*')) //true
console.log(a.test('*$')) //true
復制代碼
下面有幾個常用的[]寫法
1.[a-z] 包含字母let a=/[a-z]/;console.log(a.test('a')) //trueconsole.log(a.test('Z')) //false 因為區分大小寫console.log(a.test('abc')) //trueconsole.log(a.test('aS')) //true
2.[A-Za-z0-9]包含大寫或小寫字母或數字
復制代碼
單單使用[]是有局限的,因為它能匹配的實在是太寬泛了,只要包含即可。例如[a-z],對于字符'a2'也是符合的。要使得我們匹配更加精確,正則表達式還有許多武器,例如元字符。 元字符個人理解是一種限制規則來縮小匹配范圍 一般來說有
限定屬性以及長度。
\d 表示匹配一位整數 相反\D匹配一個非數字;\w 表示匹配一位英文單詞 相反\W匹配一個非英文單詞;\s 表示匹配一位空格 相反\S匹配一個非空格;...更多可以參考 http://www.runoob.com/jsref/jsref-obj-regexp.html
復制代碼
使用這個有什么用呢?你已經知道了屬性和長度,你可以去檢測某些連在一起的特征,例如你現在有一篇英文的文章,我需要找到特征: 3位數字+3位字母的部分標紅:
let txt='s23df12S456abx'; ==> /\d\d\d\w\w\w/let a=/\d\d/;
console.log(a.test('1')) //false
console.log(a.test('12')) //true
console.log(a.test('1ac2')) //false 必須兩個相連
let b=/\s/;
console.log(b.test('my file.js')) //true 檢測是否含有空格
復制代碼
限定位置
我們已經會使用屬性加長度了,但是有時候往往我們也需要位置的限定 。下面列舉幾個常用的元字符
$ 表示結尾 例如/js$/表示js不能再有任何字符串了,空格也不行
let a=/hello$/;
console.log(a.test('hello')) //true
console.log(a.test('hello world')) //false
console.log(a.test('hello ')) //false
^ 表示開頭 意思和 $ 相反 即使空格也不行,一般^和$成對使用,可以構造出一些常用的正則表達式。
例如
由字母和數字組成,長度不限的話可以表示為
/^[A-Za-z0-9]$/
let a=/^[A-Za-z0-9]$/;
console.log(a.test('我a')) //false
console.log(a.test('$123a')) //false
console.log(a.test('hello 23')) //fasle
console.log(a.test('hello23 ')) //false
復制代碼
如果想要使得空格也可以匹配 可以使用\b \b表示邊界,可以為開頭或者結尾 例如 ' hello,world '
let a=/\bhi\b/;console.log(a.test('hi')) //trueconsole.log(a.test('him')) //false 后面有mconsole.log(a.test('hi m')) //true hi是單獨的console.log(a.test('shi')) //false 前面有s
復制代碼
量詞使用
例如我們想匹配連續三個數字,我們可以:
/\d\d\d/
復制代碼
假如要匹配100個呢 寫100個嗎?我們不可能手動寫100個吧 我們有下面幾個常用的表述:
- +表示重復 n+匹配任何包含至少一個 n 的字符串。 /abc+/ 可以匹配 abc abcc abccccc abccccd
- *表示匹配任何包含至少0個或者一個 n 的字符串
/abc*/ 可以匹配 ab abc abccc abccd 可以不包括c
復制代碼
- {}使用 上述+和*號范圍都可以多到無限多。但是要表示具體多少個呢 我們可以使用{},這類似于數學里的表示范圍[a,b]
let a=/^c{1,3}$/;
console.log(a.test('c')) //true
console.log(a.test('cc')) //true
console.log(a.test('ccc')) //true
console.log(a.test('cccc')) //false
其中{1,3}表示出現1-3個
{1,}表示匹配一個或者一個以上
{1}表示只匹配一個。
復制代碼
當然還有許多正則表達式規則了,實在寫不完了,讀者可以自行百度。(完)