前言
由于經(jīng)常被正則虐,看見(jiàn)就不知如何處理,已斷斷續(xù)續(xù)學(xué)習(xí)過(guò)一些,但是一段時(shí)間沒(méi)有接觸就連最基本的東西也忘了,原因就是不系統(tǒng),也沒(méi)有實(shí)戰(zhàn)?,F(xiàn)在把正則表達(dá)式整理一下,方便以后的學(xué)習(xí)和實(shí)踐中掌握。
1. 什么是正則表達(dá)式
正則表達(dá)式也叫做匹配模式(Pattern),它由一組具有特定含義的字符串組成,通常用于匹配和替換文本。
正則表達(dá)式是一個(gè)高效匹配檢測(cè)的東西,對(duì)于表單檢測(cè),高亮顯示搜索結(jié)果還是進(jìn)行URL的地址映射,一般都需要用到它。
2. ReqExp
這一塊是基于《javascript高級(jí)程序設(shè)計(jì)的第三版》整理部分。
ECMAScript是通過(guò)ReqExp類型來(lái)支持正則表達(dá)式
構(gòu)造正則表達(dá)式的方法
- 以字面量的形式來(lái)定義(method1)
- 使用ReqExp構(gòu)造函數(shù)(method2)
//pattern就是一個(gè)正則表達(dá)式。
//flags用于表達(dá)正則行為的標(biāo)志。
//以字面量的形式來(lái)定義
var expression = /pattern/flags;
//構(gòu)造函數(shù)
var expression = new ReqExp("pattern","flags");
| flags標(biāo)志 | 作用 |
|---|---|
| g | 全局模式,匹配將用于所有的字符串 |
| i | 匹配不區(qū)分大小寫 |
| m | 多行模式 |
元字符
在正則表達(dá)式中有一些特殊的字符符號(hào)我們是不能直接使用的,必須對(duì)其進(jìn)行轉(zhuǎn)義后才能使用。如“\”,因?yàn)檫@些字符在正則表達(dá)式中有特殊的語(yǔ)法含義,這類字符被稱為元字符,正則表達(dá)式中的元字符有:
([{\^$|)?*+.]}都屬于元字符
如果要在正則表達(dá)式中直接匹配這些元字符,需要對(duì)它們轉(zhuǎn)義。
- 由于是直接字面量,所以轉(zhuǎn)義就ok了。(method1)
- 參數(shù)都是字符串,所以涉及到雙重轉(zhuǎn)義。(method2)

ReqExp的實(shí)例屬性
| 說(shuō)明 | |
|---|---|
| global | 表示是否設(shè)置了g標(biāo)志,返回boolean值 |
| ignoreCase | 表示是否設(shè)置了i標(biāo)志,返回boolean值 |
| lastIndex | 表示開(kāi)始搜索下一個(gè)匹配項(xiàng)的字符位置,從0開(kāi)始,返回的是整數(shù)。 |
| multiline | 表示是否設(shè)置了m標(biāo)志,返回boolean值 |
| source | 以"字面量"的形式返回正則表達(dá)式。 |
之前的這些屬性其實(shí)用于不大,就當(dāng)了解吧。
ReqExp實(shí)例方法---exec( )主力
exec(應(yīng)用模式的字符串 ),返回包含第一個(gè)匹配項(xiàng)信息的數(shù)組,但是這個(gè)數(shù)組有兩個(gè)額外的屬性index和input。
- index 表示匹配項(xiàng)在字符串中的位置。
- input 表示應(yīng)用正則表達(dá)式的字符串。
- 數(shù)組 第一項(xiàng)是與整個(gè)模式匹配的字符串,其他項(xiàng)是與模式中的捕獲組匹配的字符串。
注意:使用的exec()方法的時(shí)候設(shè)置和不設(shè)置g標(biāo)志是有區(qū)別的。
| 設(shè)置g | 不設(shè)置g |
|---|---|
| 每次調(diào)用exec( )都會(huì)在字符串中尋找新的匹配項(xiàng) | 始終只是返回第一個(gè)匹配項(xiàng)的信息。 |
練練手
//eg1:
<script type="text/javascript">
var text = "cat, bat, sat, fat";
var pattern1 = /.at/;
var matches = pattern1.exec(text);
console.log(matches.index);
console.log(matches[0]);
console.log(pattern1.lastIndex);
//還有一組返回的也是一樣的。
</script>

//eg2:
var pattern2 = /.at/g;
var matches = pattern2.exec(text);
console.log(matches.index);
console.log(matches[0]);
console.log(pattern2.lastIndex);
var matches = pattern2.exec(text);
console.log(matches.index);
console.log(matches[0]);
console.log(pattern2.lastIndex);

很明顯可以看到兩者的差別。
IE的javascript實(shí)現(xiàn)在lastIndex屬性上存在偏差,即使在非全局模式下,lastIndex屬性每次也會(huì)變化。
test( 字符串)
- 模式與該參數(shù)匹配返回true
- 不匹配就返回false
基于此,test( )一般是用在if語(yǔ)句中的。
var text = "000-00-0000"
var pattern = /\d{3}-\d{2}-\d{4}/;
if(pattern.test(text)){
console.log("matched");
//很明顯會(huì)在chorme的控制臺(tái)console中輸出matched
繼承的方法
| 方法 | 返回 |
|---|---|
| toLocaleString( ) /toString() | 返回匹配正則表達(dá)式的字面量。 |
| valueOf( ) | 返回正則表達(dá)式本身 |
//eg3:
var pattern = new RegExp("\\[bc\\]at","g");
console.log(pattern.toLocaleString());
console.log(pattern.toString());
console.log(pattern.valueOf());

以上就把正則在javascript中的大致整理了下,下面就主要整理正則表達(dá)式中的(pattern)寫法以及常用元字符的功能。
3. 元字符整理
| 元字符(常用) | 說(shuō)明 |
|---|---|
| . | 匹配除了換行符以外的任意字符 |
| \w | 匹配字母或數(shù)字或下劃線或漢字 |
| \s | 匹配任意的空白符 |
| \d == [0-9] | 匹配數(shù)字 |
| \b | 匹配單詞的開(kāi)始或結(jié)束 |
| ^ | 匹配字符串的開(kāi)始 |
| $ | 匹配字符串的結(jié)束 |
| 元字符(重復(fù)) | 說(shuō)明 |
|---|---|
| * | 重復(fù)0次或更多次 |
| + | 重復(fù)一次或更多次 |
| ? | 重復(fù)零次或一次 |
| {n} | 重復(fù)n次 |
| {n,} | 重復(fù)n次或更多次 |
| {n, m} | 重復(fù)n到m次 |
//寫一個(gè)正則可以匹配谷歌的三種網(wǎng)址
var gogle = "www.gogle.com";
var google = "www.google.com";
var gooogle = "www.gooogle.com";
var pattern = /w{3}\.go{1,3}gle\.com/i; ok
| 元字符() | 說(shuō)明 |
|---|---|
| () | 分組 |
| markdown制作表格的豎 | 表示分枝 |
| [ ] | 表示選擇里面的任意一個(gè) |
(\d{1,3}\.){3}\d{1,3} 簡(jiǎn)單的ip匹配,但是大于255也可以匹配到;
改進(jìn):
((2[0-4])\d | 25[0-5] | [01]\d\d)\. ){3}(2[0-4])\d | 25[0-5] | [01]\d\d)
| 表示的分枝
| 元字符(反義) | 說(shuō)明 |
|---|---|
| \W == [0-9A-Za-z_漢字] | 匹配任意不是字母,數(shù)字,下劃線,漢子的字符 |
| \S | 匹配任意不是空白符的字符 |
| \D == [^0-9] | 匹配任意的非數(shù)字的字符 |
| \B | 匹配不是單詞開(kāi)頭或者結(jié)尾的位置 |
| ^x | 匹配除了x意外的任意字符 |
| [^aeiou] | 匹配除了aeiou這幾個(gè)字母意外的任意字符 |
到此打住,關(guān)于后向引用,零寬斷言,負(fù)向零寬斷言,貪婪與懶惰先不整理。
參考
實(shí)戰(zhàn)區(qū)域
會(huì)不定期的整理實(shí)戰(zhàn)在這個(gè)部分。