1.正则表达式 regular expression
-用于查找 含有 匹配字符串(判断完全相等) 和 匹配元字符(通配符) 的字符串
------>你要找什么,从哪找,你要找多少<------
2.正则表达式对象
-由正则表达式创建的对象
-该对象可以进行 匹配,提取和替换
创建正则表达式对象
1)构造函数 (显式)
var regex = new RegExp ( 正则表达式字符串 [, 匹配模式]);
2)字面量(隐式)
var regex = /正则表达式/;
----------
使用正则表达式进行匹配
语法: 正则对象.test ( 字符串 ) -> bool类型
如果参数字符串中含有 复合 正则匹配的 子字符串, 就返回true ,否则返回 false
---例如:查找一段文字中是否包含ashin
var str = 'qqqqwertyioplkjashinmnbvcxz';
//找ashin,则正则表达式可用'ashin'来表示
//1.创建正则表达式对象
var r1 = new RegExp( ' ashin' );
var r2 = /ashin/;
//2.检查匹配
var res = r2.test( str );
console.log( res );
---传统字符串操作
var str = 'qqqqwertyioplkjashinmnbvcxz';
var search = 'ashin';
for(var i =0;i<str.length-search.length;i++){
//判断str[ i ] 开始 的字符串是 ashin
if( search == str.substr( i,search.length) ){
console.log( i );
break;
}
}
3.基本元字符
意义 | 用法 | ||
. | 表示任一个非换行的字符 (任意字符.无限制) | foot foo. | |
( ) | 表示分组和提高优先级 | ||
[ ] | 表示一个字符,出现在 [ ]中的字符 | [abc] ,出现在 [ ] 中的任意一个字符, 匹配 a , 或 b 或 c | |
| | 或 允许使用多个字符匹配 a | b | c | 正则表达式 | 正则表达式 foot 或 food foot | food foo( t | d) |
转义字符 : \
表示点: \ .
表示 [ ] : \ [ \ ]
表示( ) : \ ( \ )
表示 \ : \ \
4.限定元字符(你要找多少)
* | 紧跟前面的一个字符或一组字符出现 0 次到 多次 表示:12333333 后面很多3 正则: 1233* --123 0次 --1233 1次 --12333 2次 -- 123333333 1( 23 )* 表示 --1 0次 --123 1次 --12323 2次 |
+ | 紧跟在前面的字符出现 1 次到 多次 123+ |
? | 紧跟在前面的字符出现 0 次或 1次 查看一串字符串中是否含有http或https https?://.+ |
{ 数字 } | 紧跟在前面的字符出现 指定次数 a{3} aaa |
{数字,} | 紧跟在前面的字符 至少 出现指定次数 a{3,} aaa,aaaaaa,aaaaaa |
{数字,数字} | 紧跟在前面的字符出现的次数范围 a{1,3} a,aa,aaa |
5.首尾正则表达式
^ 表示必须以xx开头
^a 必须以 a开头的字符串
a 表示一个字符串中只要含有 a 就可以匹配
^a^a 非法的写法, ^,若表示开头,必须写在开头,且只能写一个
$ 表示 必须以 xxx 结尾
a$ 必须以 a 结尾
------案例
1> 身份证号:^[0123456789]{17}[0123456789x] $
2> 邮箱:^[0-9a-zA-Z]+@[0-9a-zA-Z]+(\ . [0-9a-zA-Z]+)+$
3> 匹配任意数字(考虑0和正负):^(-?[1-9] [0-9]*| 0 )$
4>匹配指点范围的数字 0 -233 (考虑1位,2位和3位):
^ ( [0-9] | [1-9] [0-9] | 1[0-9] [0-9] | 2[ 0-2][0-9] | 23[0-3] ) $
5> 匹配小数(考虑正负):^( ( - ?[1-9][0-9]* | 0 )( \ .[0-9]*[1-9] ) )$
6>匹配小数和整数(考虑小数点后字符出现0次或1次):
^( ( -? [1-9][0-9]* )( \ . [0-9] *[1-9] ) ? )$
6.简写元字符
\s 空白字符,包括空格,tab 回车换行等
\S 非空白字符
js 中常常使用[ \s \S ] 表示任意字符
\w 表示字符,包含字母,数字,下划线
\W 非字符
\d 数字
\D 非数字
--------
匹配test /^正则$/
提取exec /正则/
--------
7.提取 exec
语法: 正则表达式对象.exec ( 字符串 ) ->封装成数组
var str ='qwertyuiopashinlkjhgfdsa';
var r =/ashin/
var res = r.exec('ashin');
console.log(res);
8.循环提取
将一个字符串中符合要求的字符串都提取出来
1>正则表达式需要使用全局模式
var r = new RegExp ( '正则' , 'g' ); g -> global
var r = /正则/g;
2> 调用 exec 首先获得第一个匹配项
反复调用获得所有匹配项
若全部匹配完,还调用,则返回 null
var str ='qwer123poiu456lkjhg789asdf'
var r =/\d+/g;
//r.exec(str) ->123
//r.exec(str) ->456
// r.exec(str) ->789
// r.exec(str) ->null
var res;
while(res=r.exec(str)){
console.log(res);
}
9.将匹配的结果进行解析 [提取内容步骤123 加括号( )
[注:正则表达式中,分组有编号,从左往右'('. 从1开始 ,匹配提取的结果中,对应的编号就可以获得分解的数据]
---解析邮件地址
//将邮箱全部提取出,名字和主机名
var str='我有一个邮箱, 是 itcast@itcast.cn, 还有 abc@126.com, 和 1234567@qq.com'
//循环提取的正则表达式
var r = /[a-zA-Z\d]+@[a-zA-Z\d]+(\.[a-zA-Z\d]+)+/g;
//再次分解 (加括号分组形式)
var r = /([a-zA-Z\d]+)@([a-zA-Z\d]+(\.[a-zA-Z\d]+)+)/g;
10.匹配但不去捕获的元字符
( ? :其他正则表达式内容 )
11.截取字符串中的一个 html 标签
1>标签使用<> .So正则表达式写成 <\w+>
2>与之匹配的标签名
在正则表达式中国使用组匹配到某一个数据,允许在该正则表达式中使用'\数字'的方式引用该组 ( 一组标签名<p></p>)
<(\w+)>.*<\ / \1>
var str = '123<div>456</div>78<div>9</div>0<i></i>abc';
var r = '/<(\w+).*(\ / \ 1)>/g';
var res;
while(res=r.exec(str)){
console.log(res[0]);
}
12.贪婪模式 (尽可能多的匹配)
正则表达式中,涉及到次数限定,默认尽可能多的匹配
取消贪婪模式,在次数限定符后加?
注:贪婪模式性能高于非贪婪模式--
\d+\d+\d+
123
取消贪婪模式
\d+?\d+\d+
13.否定元字符
语法: [ ^字符 ]
非指定字符
[ ^abc ] 不是a,b,c
14.字符串的替换
语法:
字符串.replace( 查找字符串,替换字符串 ) -> 字符串
1> 字符串替换方法
字符串1.replace( 字符串2, 字符串3 )
在 字符串1 中找到 字符串2,将其替换成 字符串3 ,返回替换后的字符串
特点: 只替换第一个找到的字符串
"aaa".replace( 'a', 'A' ) -> 'Aaa'
2>正则替换
字符串.replace( 正则表达式, 字符串 ) -> 字符串
1.简单替换
'aaaaa------bbbb----ccc'.replace( /-+/,'-') -> aaaaa-bbbb----ccc
'aaaaa------bbbb----ccc'.replace( /-+/g,'-') ->aaaaa-bbbb-ccc
2.分组替换 ( 使用 $数字 来引用替换的数据 )
'abc123'.replace( /( \d+ )/,'d$1' ) ->' abcd123'
'1999-1-11'.replace( / ( \d+ ) - ( \d+ ) -( \d+ ) / ),'$1年$2月$3日') ->1993年10月24日
3>函数参数用法
语法:
字符串.replace( 正则表达式, fn )
邮箱: / \w+@\w+( \ . \w+)+/g
'我的邮箱是: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;
} );