正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
它不限于任何语言
下面对正则进简要介绍:
方括号
方括号
([])
用于正则表达式的上下文中时有特殊意义,用来查找一系列字符
表达 | 描述 |
---|---|
[...] | 查找方括号之间的任何字符 |
[^...] | 查找任何不在方括号之间的字符 |
[0-9] | 查找任何从 0 至 9 的数字 |
[a-z] | 查找任何小写 a 到小写 z 的字符 |
[A-Z] | 查找任何大写 A 到大写 Z 的字符 |
[a-Z] | 查找任何小写 a 到大写 Z 的字符 |
解读:
-
[0-9a-zA-Z\_]
可以匹配一个数字、字母或者下划线; -
[0-9a-zA-Z\_]+
可以匹配至少由一个数字、字母或者下划线组成的字符串,比如'a100'
,'0_Z'
,'js2015'
等等; -
[a-zA-Z\_\$][0-9a-zA-Z\_\$]*
可以匹配由字母或下划线、$
开头,后接任意个由一个数字、字母或者下划线、$
组成的字符串 -
[a-zA-Z\_\$][0-9a-zA-Z\_\$]{0, 19}
更精确地限制了变量的长度是1-20个字符(前面1个字符+后面最多19个字符)。
量词
方括号括起来的字符序列或单个字符出现的频率或位置可以用一个特殊的符号来表示。每个特殊字符都有一个特定的含义。+、*、? 和 $ 符号都遵循一个字符序列模式
表达 | 描述 |
---|---|
p+ | 匹配任何包含至少一个 p 的字符串 |
p* | 匹配任何包含零个或多个 p 的字符串 |
p? | 匹配任何包含零个或一个 p 的字符串 |
p{N} | 匹配包含 N 个 p 的序列字符串 |
p{2,3} | 匹配包含 2 或 3 个 p 的序列的字符串 |
p{2,} | 匹配包含至少 2 个 p 的序列的字符串 |
p$ | 匹配任何结尾为 p 的字符串 |
^p | 匹配任何开头为 p 的字符串 |
元字符
字符 | 描述 |
---|---|
. | 单个字符 |
\s | 空白字符(空格、制表符、换行符) |
\S | 非空白字符 |
\d | 数字字符(0-9) |
\D | 非数字字符 |
\w | 单词字符(a-z,A-Z,0-9,_) |
\W | 非单词字符 |
[\b] | 一个文字退格(特殊情况) |
[aeiou] | 匹配一个在给定集合内的字符 |
[^aeiou] | 匹配一个不在给定集合内的字符 |
[foo|bar|baz] | 匹配任何指定的备选方案 |
解读:
-
'00\d'
可以匹配'007'
,但无法匹配'00A'
; -
'\d\d\d'
可以匹配'010'
; -
'\w\w'
可以匹配'js'
; -
'js.'
可以匹配'jsp'
、'jss'
、'js!'
等等。
解读\d{3}\-\d{3,8}
表达式
1、\d{3}
表示匹配三个数字,例如123
, 010
等
2、\-
表示匹配特殊字符-
3、\d{3,8}
表示3到8个数字,例如 1234567
综上所述:可以匹配 010-88888888
, 021-12345678
等
RegExp方法
方法 | 描述 |
---|---|
exec() | 检索字符串中指定的值。返回找到的值,并确定其位置 |
test() | 检索字符串中指定的值。返回 ture 或 false |
toSource | 返回一个对象字面值代表指定的对象;您可以使用这个值来创建一个新的对象。 |
toString() | 返回一个代表指定对象的字符串。 |
JavaScript 中正则表达式的使用
RegExp() 构造函数定义
方式一
var pattern = new RegExp(pattern, attributes);
方式二
var patter = /pattern/attributes;
pattern:是一个字符串,指定了正则表达式的模式或其他正则表达式。
attributes:是一个可选的字符串,包含属性 "g"、"i" 和 "m",分别用于指定全局匹配、区分大小写的匹配和多行匹配。
两种写法是一样的
实例:
var re1 = /ABC\-001/;
var re2 = new RegExp('ABC\\-001');
re1; // /ABC\-001/
re2; // /ABC\-001/
如果使用第二种写法,因为字符串的转义问题,字符串的两个\\
实际上是一个\
。
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']
无法识别连续的空格,用正则表达式试试:
'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的正则表达式还有几个特殊的标志,最常用的是g,表示全局匹配:
var r1 = /test/g;
// 等价于:
var r2 = new RegExp('test', 'g');
全局匹配可以多次执行exec()方法来搜索一个匹配的字符串。当我们指定g标志后,每次运行exec(),正则表达式本身会更新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,直到结束仍没有匹配到