正则表达式(Regular Expression)
创建:
1.构造函数:
var regex = new RegExp('xyz', 'i');
2.字面量
var regex = /xyz/i;
修饰符:
g
:global,全文搜索,不添加的话搜索到第一个结果停止搜索i
:ingore case,忽略大小写,默认大小写敏感m
:multiple lines,多行搜索
需要转义的元字符
( [ { \ ^ $ | ) ? * + .
正则表达式模式
表达式 | 描述 |
---|---|
字符类 | – |
[] |
比如[abcd] 代表一个字符,这个字符可以是 abcd四个字符中的任意一个 |
^ |
取反,比如表达式 [^abc] 表示一个不是字符a或b或c的字符 |
范围类 | – |
[0-9 ] |
0-9中的任意一个字符 |
[a-z] |
a-z中的任意一个字符 |
[a-zA-Z0-9] |
大写字母、小写字母、数字中的任意一个字符 |
预定义类 | – |
. |
等同于[^\r\n] ,除了回车符和换行符之外的所有字符 |
\d |
等同于[0-9] |
\D |
等同于[^0-9] ,非数字字符 |
\s |
等同于[\t\n\x0B\f\r] , 空白符 |
\S |
等同于^[\t\n\x0B\f\r] , 非空白符 |
\w |
等同于[a-zA-Z_0-9] ,单词字符(字母、数字、下划线) |
\W |
等同于[^a-zA-Z_0-9] ,非单词字符 |
边界类 | – |
^ (与[ 不相邻的情况下) |
以xxx开头, 如:^hello ,以hello开头的字符 |
$ |
以xxx结尾,如:hello$ ,以hello结尾的字符 |
\b |
单词(字母、数字、下划线)边界,注意:- 也被认为是单词边界 |
\B |
非单词边界 |
量词 | – |
? |
出现零次或一次(最多出现一次) |
+ |
出现一次或多次(至少出现一次) |
* |
出现零次或多次(任意次) |
{n} |
出现n次 |
{n,m} |
出现n到m次,在既可能匹配n次也可能匹配m次时,会尽可能多地匹配,即会匹配m次,这是所谓的贪婪模式。非贪婪模式,尽可能少的匹配, 形式为{n,m}? |
{n,} |
至少出现n次 |
分组 | – |
() |
把多个字符作为一个整体 |
前瞻 | – |
exp1(?=exp2) |
匹配后面是exp2的exp1 |
exp1(?!exp2) |
匹配后面不是exp2的exp1 |
一些字面量查找小例子
- 如何匹配一个合法的 url?(url 以 http 或者 https 或者 // 开头)
var reg = /^(https?:)?\/\/.+/
- 如何匹配一个手机号?
var reg2 = /^1[3578]\d{9}$/
RegExp对象实例属性
.ignoreCase
:返回一个布尔值,是否大小写敏感,默认是false。.global
: 是否全局搜索,默认是false.multiline
: 多行搜索,默认值是false.lastIndex
: 下一次开始搜索的位置,每次正则表达式成功匹配时,lastIndex属性值都会随之改变,可读写。.source
: 返回正则表达式的字符串形式(不包括反斜杠),该属性只读。
RegExp对象实例方法
RegExp.prototype.test(str)
// 测试字符串参数中是否存正则表达式模式,如果存在则返回true,否则返回false
var r = /x/g;
var s = '_x_x';
r.lastIndex // 0
r.test(s) // true
// 如果正则表达式带有g修饰符,则每一次test方法都从上一次结束的位置开始向后匹配。
r.lastIndex // 2
r.test(s) // true
// 如果正则模式是一个空字符串,则匹配所有字符串。
new RegExp('').test('abc') // true
RegExp.prototype.exec(str)
// 返回匹配结果。如果发现匹配,就返回一个数组,成员是匹配成功的子字符串,否则返回null
var r = /a(b+)a/; //有圆括号的情况下,返回的数组会包括多个成员,后面的成员就是圆括号对应的匹配成功的组
var arr = r.exec('_abbba_aba_');
arr // ["abbba", "bbb"]
//整个模式匹配成功的开始位置(从0开始计数)
arr.index // 1
//整个原字符串。
arr.input // "_abbba_aba_"
//如果正则表达式加上g修饰符,则可以使用多次exec方法
var reg = /a/g;
var str = 'abc_abc_abc'
var r1 = reg.exec(str);
r1 // ["a"]
r1.index // 0
reg.lastIndex // 1
var r2 = reg.exec(str);
r2 // ["a"]
r2.index // 4
reg.lastIndex // 5
var r3 = reg.exec(str);
r3 // ["a"]
r3.index // 8
reg.lastIndex // 9
String的实例方法(与正则表达式有关)
String.prototype.match()
var s = '_x_x';
var r1 = /x/;
var r2 = /y/;
s.match(r1) // ["x"]
s.match(r2) // null
//与正则对象的exec方法非常类似,不同的是若带有g修饰符,,会一次性返回所有匹配成功的结果
var s = 'abba';
var r = /a/g;
s.match(r) // ["a", "a"]
String.prototype.search()
// 返回第一个满足条件的匹配结果在整个字符串中的位置。如果没有任何匹配,则返回-1。
'_x_x'.search(/x/) // 1
String.prototype.replace()
str.replace(search, replacement) //替换匹配的值,第一个是正则表达式,表示搜索模式,第二个是替换的内容,可以是函数。
'aaa'.replace(/a/, 'b') // "baa"
'aaa'.replace(/a/g, 'b') // "bbb"
String.prototype.split()
// 按照正则规则分割字符串,返回一个由分割后的各个部分组成的数组。
str.split(separator, [limit]) //第一个参数是正则表达式,表示分隔规则,第二个参数是返回数组的最大成员数。