正則表達(dá)式(regular expression)描述了一種字符串匹配的模式(pattern)白群,可以用來檢查一個串是否含有某種子串、將匹配的子串替換或者從某個串中取出符合某個條件的子串等书释。
它不限于任何語言
下面對正則進(jìn)簡要介紹:
方括號
方括號
([])
用于正則表達(dá)式的上下文中時有特殊意義贝攒,用來查找一系列字符
表達(dá) | 描述 |
---|---|
[...] | 查找方括號之間的任何字符 |
[^...] | 查找任何不在方括號之間的字符 |
[0-9] | 查找任何從 0 至 9 的數(shù)字 |
[a-z] | 查找任何小寫 a 到小寫 z 的字符 |
[A-Z] | 查找任何大寫 A 到大寫 Z 的字符 |
[a-Z] | 查找任何小寫 a 到大寫 Z 的字符 |
解讀:
-
[0-9a-zA-Z\_]
可以匹配一個數(shù)字、字母或者下劃線烹笔; -
[0-9a-zA-Z\_]+
可以匹配至少由一個數(shù)字、字母或者下劃線組成的字符串抛丽,比如'a100'
谤职,'0_Z'
,'js2015'
等等亿鲜; -
[a-zA-Z\_\$][0-9a-zA-Z\_\$]*
可以匹配由字母或下劃線允蜈、$
開頭,后接任意個由一個數(shù)字蒿柳、字母或者下劃線饶套、$
組成的字符串 -
[a-zA-Z\_\$][0-9a-zA-Z\_\$]{0, 19}
更精確地限制了變量的長度是1-20個字符(前面1個字符+后面最多19個字符)。
量詞
方括號括起來的字符序列或單個字符出現(xiàn)的頻率或位置可以用一個特殊的符號來表示垒探。每個特殊字符都有一個特定的含義妓蛮。+、*圾叼、? 和 $ 符號都遵循一個字符序列模式
表達(dá) | 描述 |
---|---|
p+ | 匹配任何包含至少一個 p 的字符串 |
p* | 匹配任何包含零個或多個 p 的字符串 |
p? | 匹配任何包含零個或一個 p 的字符串 |
p{N} | 匹配包含 N 個 p 的序列字符串 |
p{2,3} | 匹配包含 2 或 3 個 p 的序列的字符串 |
p{2,} | 匹配包含至少 2 個 p 的序列的字符串 |
p$ | 匹配任何結(jié)尾為 p 的字符串 |
^p | 匹配任何開頭為 p 的字符串 |
元字符
字符 | 描述 |
---|---|
. | 單個字符 |
\s | 空白字符(空格蛤克、制表符、換行符) |
\S | 非空白字符 |
\d | 數(shù)字字符(0-9) |
\D | 非數(shù)字字符 |
\w | 單詞字符(a-z,A-Z,0-9,_) |
\W | 非單詞字符 |
[\b] | 一個文字退格(特殊情況) |
[aeiou] | 匹配一個在給定集合內(nèi)的字符 |
[^aeiou] | 匹配一個不在給定集合內(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}
表示匹配三個數(shù)字,例如123
, 010
等
2呀邢、\-
表示匹配特殊字符-
3洒沦、\d{3,8}
表示3到8個數(shù)字,例如 1234567
綜上所述:可以匹配 010-88888888
, 021-12345678
等
RegExp方法
方法 | 描述 |
---|---|
exec() | 檢索字符串中指定的值。返回找到的值驼鹅,并確定其位置 |
test() | 檢索字符串中指定的值微谓。返回 ture 或 false |
toSource | 返回一個對象字面值代表指定的對象;您可以使用這個值來創(chuàng)建一個新的對象。 |
toString() | 返回一個代表指定對象的字符串输钩。 |
JavaScript 中正則表達(dá)式的使用
RegExp() 構(gòu)造函數(shù)定義
方式一
var pattern = new RegExp(pattern, attributes);
方式二
var patter = /pattern/attributes;
pattern:是一個字符串豺型,指定了正則表達(dá)式的模式或其他正則表達(dá)式。
attributes:是一個可選的字符串买乃,包含屬性 "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)義問題功戚,字符串的兩個\\
實(shí)際上是一個\
娶眷。
RegExp對象的test()方法用于測試給定的字符串是否符合條件,返回 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']
無法識別連續(xù)的空格,用正則表達(dá)式試試:
'a b c'.split(/\s+/); // ['a', 'b', 'c']
無論多少個空格都可以正常分割啸臀。加入,試試:
'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á)式還有幾個特殊的標(biāo)志届宠,最常用的是g,表示全局匹配:
var r1 = /test/g;
// 等價于:
var r2 = new RegExp('test', 'g');
全局匹配可以多次執(zhí)行exec()方法來搜索一個匹配的字符串乘粒。當(dāng)我們指定g標(biāo)志后豌注,每次運(yùn)行exec(),正則表達(dá)式本身會更新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é)束仍沒有匹配到