
正則表達(dá)式(regular expression)描述了一種字符串匹配的模式(pattern),可以用來檢查一個(gè)串是否含有某種子串、將匹配的子串替換或者從某個(gè)串中取出符合某個(gè)條件的子串等。
它不限于任何語言
下面對(duì)正則進(jìn)簡(jiǎn)要介紹:
方括號(hào)
方括號(hào)
([])用于正則表達(dá)式的上下文中時(shí)有特殊意義,用來查找一系列字符
| 表達(dá) | 描述 |
|---|---|
| [...] | 查找方括號(hào)之間的任何字符 |
| [^...] | 查找任何不在方括號(hào)之間的字符 |
| [0-9] | 查找任何從 0 至 9 的數(shù)字 |
| [a-z] | 查找任何小寫 a 到小寫 z 的字符 |
| [A-Z] | 查找任何大寫 A 到大寫 Z 的字符 |
| [a-Z] | 查找任何小寫 a 到大寫 Z 的字符 |
解讀:
-
[0-9a-zA-Z\_]可以匹配一個(gè)數(shù)字、字母或者下劃線; -
[0-9a-zA-Z\_]+可以匹配至少由一個(gè)數(shù)字、字母或者下劃線組成的字符串,比如'a100','0_Z','js2015'等等; -
[a-zA-Z\_\$][0-9a-zA-Z\_\$]*可以匹配由字母或下劃線、$開頭,后接任意個(gè)由一個(gè)數(shù)字、字母或者下劃線、$組成的字符串 -
[a-zA-Z\_\$][0-9a-zA-Z\_\$]{0, 19}更精確地限制了變量的長(zhǎng)度是1-20個(gè)字符(前面1個(gè)字符+后面最多19個(gè)字符)。
量詞
方括號(hào)括起來的字符序列或單個(gè)字符出現(xiàn)的頻率或位置可以用一個(gè)特殊的符號(hào)來表示。每個(gè)特殊字符都有一個(gè)特定的含義。+、*、? 和 $ 符號(hào)都遵循一個(gè)字符序列模式
| 表達(dá) | 描述 |
|---|---|
| p+ | 匹配任何包含至少一個(gè) p 的字符串 |
| p* | 匹配任何包含零個(gè)或多個(gè) p 的字符串 |
| p? | 匹配任何包含零個(gè)或一個(gè) p 的字符串 |
| p{N} | 匹配包含 N 個(gè) p 的序列字符串 |
| p{2,3} | 匹配包含 2 或 3 個(gè) p 的序列的字符串 |
| p{2,} | 匹配包含至少 2 個(gè) p 的序列的字符串 |
| p$ | 匹配任何結(jié)尾為 p 的字符串 |
| ^p | 匹配任何開頭為 p 的字符串 |
元字符
| 字符 | 描述 |
|---|---|
| . | 單個(gè)字符 |
| \s | 空白字符(空格、制表符、換行符) |
| \S | 非空白字符 |
| \d | 數(shù)字字符(0-9) |
| \D | 非數(shù)字字符 |
| \w | 單詞字符(a-z,A-Z,0-9,_) |
| \W | 非單詞字符 |
| [\b] | 一個(gè)文字退格(特殊情況) |
| [aeiou] | 匹配一個(gè)在給定集合內(nèi)的字符 |
| [^aeiou] | 匹配一個(gè)不在給定集合內(nèi)的字符 |
| [foo|bar|baz] | 匹配任何指定的備選方案 |
解讀:
-
'00\d'可以匹配'007',但無法匹配'00A'; -
'\d\d\d'可以匹配'010'; -
'\w\w'可以匹配'js'; -
'js.'可以匹配'jsp'、'jss'、'js!'等等。
解讀\d{3}\-\d{3,8}表達(dá)式
1、\d{3} 表示匹配三個(gè)數(shù)字,例如123, 010 等
2、\- 表示匹配特殊字符-
3、\d{3,8}表示3到8個(gè)數(shù)字,例如 1234567
綜上所述:可以匹配 010-88888888, 021-12345678 等
RegExp方法
| 方法 | 描述 |
|---|---|
| exec() | 檢索字符串中指定的值。返回找到的值,并確定其位置 |
| test() | 檢索字符串中指定的值。返回 ture 或 false |
| toSource | 返回一個(gè)對(duì)象字面值代表指定的對(duì)象;您可以使用這個(gè)值來創(chuàng)建一個(gè)新的對(duì)象。 |
| toString() | 返回一個(gè)代表指定對(duì)象的字符串。 |
JavaScript 中正則表達(dá)式的使用
RegExp() 構(gòu)造函數(shù)定義
方式一
var pattern = new RegExp(pattern, attributes);
方式二
var patter = /pattern/attributes;
pattern:是一個(gè)字符串,指定了正則表達(dá)式的模式或其他正則表達(dá)式。
attributes:是一個(gè)可選的字符串,包含屬性 "g"、"i" 和 "m",分別用于指定全局匹配、區(qū)分大小寫的匹配和多行匹配。
兩種寫法是一樣的
實(shí)例:
var re1 = /ABC\-001/;
var re2 = new RegExp('ABC\\-001');
re1; // /ABC\-001/
re2; // /ABC\-001/
如果使用第二種寫法,因?yàn)樽址霓D(zhuǎn)義問題,字符串的兩個(gè)\\實(shí)際上是一個(gè)\。
RegExp對(duì)象的test()方法用于測(cè)試給定的字符串是否符合條件,返回 true 和 false
var re = /^\d{3}\-\d{3,8}$/;
re.test('010-12345'); // true
re.test('010-1234x'); // false
re.test('010 12345'); // false
切分字符串
'a b c'.split(' '); // ['a', 'b', '', '', 'c']
無法識(shí)別連續(xù)的空格,用正則表達(dá)式試試:
'a b c'.split(/\s+/); // ['a', 'b', 'c']
無論多少個(gè)空格都可以正常分割。加入,試試:
'a,b, c d'.split(/[\s\,]+/); // ['a', 'b', 'c', 'd']
再加入;試試:
'a,b;; c d'.split(/[\s\,\;]+/); // ['a', 'b', 'c', 'd']
分組
用()表示的就是要提取的分組(Group)
var re = /^(\d{3})-(\d{3,8})$/;
re.exec('010-12345'); // ['010-12345', '010', '12345']
re.exec('010 12345'); // null
全局搜索
JavaScript的正則表達(dá)式還有幾個(gè)特殊的標(biāo)志,最常用的是g,表示全局匹配:
var r1 = /test/g;
// 等價(jià)于:
var r2 = new RegExp('test', 'g');
全局匹配可以多次執(zhí)行exec()方法來搜索一個(gè)匹配的字符串。當(dāng)我們指定g標(biāo)志后,每次運(yùn)行exec(),正則表達(dá)式本身會(huì)更新lastIndex屬性,表示上次匹配到的最后索引:
var s = 'JavaScript, VBScript, JScript and ECMAScript';
var re=/[a-zA-Z]+Script/g;
// 使用全局匹配:
re.exec(s); // ['JavaScript']
re.lastIndex; // 10
re.exec(s); // ['VBScript']
re.lastIndex; // 20
re.exec(s); // ['JScript']
re.lastIndex; // 29
re.exec(s); // ['ECMAScript']
re.lastIndex; // 44
re.exec(s); // null,直到結(jié)束仍沒有匹配到