1.创建正则表达式的方法
1.1创建正则表达式的两种方法
-
构造函数
- var regex=new RegExp(正则表达式[,匹配模式]);
-
字面量
- var regex = /正则表达式/;
1.2使用正则表达式进行匹配
正则对象.test( 字符串 ) -> bool
如果参数字符串中含有 复合 正则匹配的 子字符串, 就返回 true, 否则返回 false
代码演示:
// 查询一段文字中是否包含 itcast
// 0123456789012345678901
var str = 'qwertyuiopasdfghjklxcitcastvbnm,wertyuioqwsdfgbhnjmzxcfvghjuiko';
// 要找 itcast, 因此正则表达式就可以使用 'itcast' 来表示
// 1, 创建正则表达式对象
var r1 = new RegExp( 'itcast' );
var r2 = /itcast/;
// 2, 开始检查匹配
var res = r2.test( str );
console.log( res );
// 使用传统字符串操作
var search = 'itcast'
for ( var i = 0; i < str.length - search.length; i++ ) {
// 判断 str[ i ] 开始 的字符串是 itcast
if ( search == str.substr( i, search.length ) ) {
console.log( i );
break;
}
}
1.3元字符
1. . 查找单个字符,(除了换行和行结束符)
2. () 分组和提高优先级
3. [] 表示一个字符
用法:[abc]出现[]中任意一个字符
可以匹配 a, b, c
4. | (或) 或的功能 优先级最低
-----------------------------------------------
扩展:
. 任意的一个字符,没有任何限制
[] 是出现在[]中的一个字符。 认为 . 的限制级版本
[abc]: a,b,或c
| 可以认为是允许使用多个字符的匹配
5.转义字符:\
表示点: \.
表示[]: \[ \]
表示(): \( \)
表示\: \\
5.限定元字符
* 紧跟前面的一个字符或一组字符出现0次到多次
+ 紧跟在前面的字符出现1次到多次
? 紧跟在前面的字符出现 0次 或者 1次
{数字} 紧跟在前面字符的出现指定次数
{数字,} 紧跟在前面的字符至少出现的字符
{数字,数字} 紧跟在前面的字符出现的次数范围。
1.4首尾正则表达式
^ 表示必须以 xxx 开头
$ 表示必须以 xxx 结尾
^a 表示以a开头的字符串
b$ 表示以b结尾的字符串
1.5简写元字符
\s 空白字符,包括空格,tab,回车换行等
\S 非空白字符
js中常使用[\s\S]表示任意字符
\w 表示字符,包含数字,字母,下划线
\W 非字符
\d 代表数字
\D 非数字
1.6 exec 提取
使用正则表达式进行匹配,使用exec 可以将匹配到的数据提取出来。
语法:
正则表达式 exp.exec(字符串)--> 封装成数组
返回值:匹配到的表达式, 匹配子项
// 案例: 在 'abc123def456ghij789klum' 提取数字
var str = 'abc123def456ghij789klum';
// 1> 全局模式
var r = /\d+/g;
// 2> 匹配要使用循环的方式
var res;
//可以循环匹配出所有的匹配项。
while ( res = r.exec( str ) ) {
console.log( res );
}
注意:可以 (:?) 不捕获子项。
1.7 反向引用
2> 与之匹配的标签名是什么?(反向引用)
如果在一个正则表达式中使用组匹配到某一个数据, 允许在该正则表达式中使用
'\数字' 的方式引用该组
<(\w+)>.*<\/\1>
1.8 贪婪模式
凡是在正则表达式中, 涉及到次数限定的, 一般默认都是尽可能的多匹配.
取消贪婪模式. 在次数限定符后面加上 ?
注意: 贪婪模式性能会略高于非贪婪模式, 所以开发的时候. 一般不考虑贪婪的问题
只有代码匹配结果出现问题了, 一般一次多匹配了, 才会取消贪婪。
1.9 否定元字符
[^abc] 表示匹配除了a,b,c以外的字符。
1.10 replace方法
字符串.replace( 正则表达式, 字符串 ) -> 字符串
1. 简单替换
'aaaaa-------bbbbbb------ccccc'.replace( /-+/, '-' )
'aaaaa-------bbbbbb------ccccc'.replace( /-+/g, '-' )
2. 分组替换
可以在替换字符串中, 使用 $数字 来引用替换的数据
'abc123'.replace( /(\d+)/, 'd$1' ) -> 'abcd123'
'1991-1-1'
中国: 1991年1月1日
欧洲: 1/1/1991
... : 1991 1 1
'1991-1-19'.replace( /(\d+)-(\d+)-(\d+)/, '$1年$2月$3日' )
3> 函数参数用法(了解)
语法:
字符串.replace( 正则表达式, fn )
'我的邮箱是:abc@itcast.cn, 你的邮箱是: defghijk@itcast.cn'
.replace( /\w+@\w+(\.\w+)+/g, '*' );
'我的邮箱是:abc@itcast.cn, 你的邮箱是: def@itcast.cn'
.replace( /(\w+)@(\w+(\.\w+)+)/g, function ( s, g1, g2, g3 ) {
return '*';
} );
// 要求 只显示 第一个字符, 其余的都是用 * 表示
'我的邮箱是:abc@itcast.cn, 你的邮箱是: defghijklim@itcast.cn'
.replace( /(\w+)@(\w+(\.\w+)+)/g, function ( s, g1, g2, g3 ) {
// 将用户名 变成 a***** 的形式
var first = g1.charAt( 0 );
var start = [];
for ( var i = 0; i < g1.length - 1; i++ ) {
start.push( '*' );
}
return first + start.join('') + '@' + g2;
} );