JavaScript基础 正则表达式
正则表达式
是对象类型 英文:RegExp
作用是用来匹配字符
如何使用:
test方法的使用
reg.test( str );检测str里面有没有reg规则,有的话返回true,没有返回false
注意事项:
使用test的时候注意g的时候
例:
var str = 'get';
var reg = /get/gi; 注意如果加g全局匹配的话 第一匹配到 不会马上完
get匹配到str的get 返回true
但这时候不会马上停 而会再向下匹配,str里get下一个是空字符串 正则还会跟这个空字符串匹配 返回是false
console.log( reg.test( str ) )
console.log( reg.test( str ) )
例:
第一种创建写法
var reg = /abc/; 制定出索引规则
var str = 'abckdfirf';
alert( reg.test( str ) )
检测str里有没有abc这三个连着的字符
我们如果有一个变量要索引这个变量的值,上面是没办法传变量
第二种创建写法
var a = 'abc';
var reg = new RegExp( a ); //如果要索引一个变量一定是这样创建
var str = 'abckdfirf';
alert( reg.test( str ) )
转义符号
转义符号结合某些字母而表现出的特殊意义
1、
\d匹配一个数字( 0、1、2、3、4、5、6、7、8、9)
\D匹配一个非数字
var reg = /\d/;
var str = 'abckf3';
console.log( reg.test( str ) ) //检测出str里有没有数字
2、
\s 一个空格字符串 、tab符号 所有会产生空格的(/n /s ' ')都可以匹配出来
\S匹配非空格的字符
var reg = /\s/;
var str = 'abckf 3';
console.log( reg.test( str ) ) //检测出str里有没有空格
3、
\w 一个字母/数字/_字符 只匹配这三个类型
\W 匹配除了\w外其他都可以
var reg = /\w/;
var str = 'abckf3';
console.log( reg.test( str ) ) //检测出str里有没有字母/数字/_字符
4、
\b 一个单词边界 /边词符号(匹配一个单词)
\B 除了\b外的
var reg = /aLi/;
var str = 'aLikkkk is a man';
reg.test( str )//这里就匹配aLi有这三个字符(不严谨)
现在要只匹配单单aLi有这个单词
var reg = /\baLi\b/;
var str = 'aLikkkk is a man';
reg.test( str ) //这里匹配不行 aLikkkk 包含在里面 不是一个单词
只有当aLi 一个单词出现时才会匹配
var str = 'aLi kkkk is a man'; //要有边界
(单词边界:起始位置、空格、所有除了\w之外的字符都可以( + - 汉字))
var str = 'aLi汉kkkk is a man';
转义符号
展现出某个具有特殊意义的字符
1、把一个具有特殊意义的字符变得没有特殊意义
var str = '\'';
alert( str )\\ 这里弹出'
var str = '\\'
alert( str ) 这里弹出 \
注意一个\转义符号控制一个转义字符
如果要输出\\\
var str = '\\\\\\';
alert( str )
var str = '\"\"\" '
alert( str ) \\ """
2、和一些单词结合有换行或着制表符的意思 \n(换行) \r(换行) \t(制表符)
var str = '阿\n里';
alert( str );

var reg = /\//,
str = '/';
alert( reg.test( str ))
数量词
使用方法:
字符串.match( 正则 )
将匹配成功的内容整合成数组返回,匹配不成功返回null
var reg = /cg/;
var str = 'abcggggg';
console.log( str.match( reg ) )

var reg = /\d\d\d/, //有几个数字就要有几个\d
str = 'abcgggg225gcg';
console.log( str.match( reg ))

我们如果不知道有几个数字呢
+ :匹配大于等于1个 ,尽可能多的匹配
? :没有或着1个的匹配
* :至少0个
{n,m} :常规数量词,n和m是自然数 n>m 限定前面有几个
{n} :常规数量词,最少有n 多于n只取到最近的n个
{n,} :常规数量词,n个到无穷大
+案例
var reg = /\d+/, //有几个数字就要有几个\d
str = 'abcgggg288854g5655cg';
console.log( str.match( reg ))

?案例
var reg = /a?fei/, //一定要匹配到afei 有时候我们要匹配 有a 或着没有a
str = 'fei';
console.log( str.match( reg ))

var reg = /a?fei/, //一定要匹配到afei 有时候我们要匹配 有a 或着没有a
//?只针对于问号前面的那个单位起作用
str = 'aaaaaafei';
console.log( str.match( reg ))

?只针对于问号前面的那个单位起作用
* 案例
var reg = /a*fei/,
str = 'aaaaafei';
console.log( str.match( reg ))

{n,m}案例
var reg = /a{2,5}fei/, //限定匹配a有要2到5个 没有的话就null
str = 'aaaaafei';
console.log( str.match( reg ))
var reg = /a{2,5}fei/,
str = 'aaaaaaaaafei';
console.log( str.match( reg ))
a超过5过只能匹配最近的5个
数量词的贪婪 和 惰性
贪婪:匹配最多的
惰性:匹配最少的
var str = 'AAAAABBBBCCC';
var reg = /a{0,10}/ig; 贪婪匹配
console.log( str.match( reg ) ) 图A
原理是: a先取10个 去匹配 看str里有没有 如果没有 就变成 9 8 7 6 5
到5时可以匹配成功 就取 AAAAA
下来和B匹配 匹配量词可以取到0 B就会匹配成 ' '空字符 ....
var str = 'AAAAABBBBCCC';
var reg = /a{0,3}/ig; 贪婪匹配
console.log( str.match( reg ) ) 图A
原理是: a先取10个 去匹配 看str里有没有 如果没有 就变成 9 8 7 6 3
到3时可以匹配成功 就取 AAA
str 看成被取走AAA(原str不会改变) AABBBBCCC
下来对 AABBBBCCC 就可以取到AA
下来和B匹配 匹配量词可以取到0 B就会匹配成 ' '空字符 ....
var str = 'AAAAABBBBCCC';
var reg = /a{1,3}?/gi; //惰性匹配
console.log( str.match( reg ) ) //图C
原理:惰性匹配规则a取1个去匹配
str第一就是A 匹配成功 AAAABBBBCCC
再继续匹配 A 匹配成功 AAABBBBCCC
再继续匹配 A 匹配成功 AABBBBCCC
再继续匹配 A 匹配成功 ABBBBCCC
再继续匹配 A 匹配成功 BBBBCCC
下来就B就不符合 匹配不成功
就停了



var str = '1245874';
var reg = /\d{2,3}; //默认是贪婪匹配
console.log( str.match( reg ) ); (图一)
var str = '1245874';
var reg = /\d{2,3}?/; //?变成惰性匹配
console.log( str.match( reg ) ); (图二)
var str = 'aa21231212154121123';
var reg = /aa\d+123/; //默认是贪婪匹配
console.log( str.match( reg ) );(图三)
var str = 'aa21231212154121123';
var reg = /aa\d+?123/; //惰性匹配
console.log( str.match( reg ) );(图四)




<script>
var str = 'aaaabbbbdddd';
var reg = /a{1,5}/g;//贪婪匹配
console.log( str.match( reg ) );
</script> (图五)
<script>
var str = 'aaaabbbbdddd';
var reg = /a{1,5}?/g; //惰性匹配
console.log( str.match( reg ) );
</script> (图六)
<script>
var str = 'aaaabbbbdddd';
var reg = /a??/g; //第一个?是指 {0,1}
console.log( str.match( reg ) );
</script> 图七



匹配的是0到1个 ?是惰性 这里会取0个去匹配 取' '字符去匹配
修饰符
i:不区分大小写
g: 全局匹配,匹配成功不会结束,只到最末尾才结束
m: 换行匹配(默认不换行)
g案例
var str = '一狗:10,二狗:12,三狗:13';
var reg = /\d+/; //只匹配一个就结束
console.log( str.match( reg ) );

匹配全部
var str = '一狗:10,二狗:12,三狗:13';
var reg = /\d+/g; //匹配全部 得到标准的数组
console.log( str.match( reg ) );

i案例
var str = 'aabc';
var reg = /AB/; //匹配不到
console.log( str.match( reg ) );
var str = 'aabc';
var reg = /AB/i; //匹配到 得到的类数组
console.log( str.match( reg ) ); (图一)
var str = 'aabc';
var reg = /AB/ig; //匹配到 得到的数组
//修饰词可以多个 放在一起
console.log( str.match( reg ) );(图二)


字符集
匹配数字或字母的范围 (第一功能)
[0 - 9]区间可以拆分 (常用)可以看成 0|1|2|3........9
[a - z]区间可以拆分 (常用) 可以看成 a|b|c|d........z
[A - Z]区间可以拆分 (常用) 同上
[0 - z] 匹配数字跟字母 根据ANSI码来排的
[ a - Z ] 不能拆分 不能跨区间
var str = '0123456789';
var reg = /[2-8]/;//只能匹配到一个
console.log( str.match(reg) )

var str = '0123456789';
var reg = /[2-8]/g;//全局 匹配到所有
console.log( str.match(reg) )

var str = '0123456789';
var reg = /[2-8]{2}/g;//全局 匹配2个2个
console.log( str.match(reg) )

var str = 'abcdefghijklmnzofjf';
var reg = /[a-g]/g;
console.log( str.match(reg) )

var str = 'abcdefghijklmnzofjf';
var reg = /[a-g]{2}/g;
console.log( str.match(reg) )

var str = 'ab58jk85AAo-fjf';
var reg = /[a-z]/ig; //i不区分大小写 (代表所有大小写字母)
console.log( str.match(reg) )

或者 | 的功能
匹配 a 或着 g
var str = 'abcdefghijklmnzofjf';
var reg = /[ag]/g;
console.log( str.match(reg) )

var str = 'ab58jk85AAofjf';
var reg = /[0-9a-zA-Z]/g;//匹配数字跟所有字母
console.log( str.match(reg) )

注意如果要匹配-要转义
var str = 'ab58jk85AAo-fjf';
var reg = /[0-9a-zA-Z\-]/g;
console.log( str.match(reg) )

配合内部 ^ 除了的意思 只能写在第一位
放外面 reg = /a^/
var str = 'ab58jk85AAo-fjf';
var reg = /[^\d]/g; //除了数字外 汉字 + ,字母...都可以匹配得到
console.log( str.match(reg) )

字集
() 匹配 (一个整体)匹配里面这个整体
var str = 'ab58jkab85AAo-fjf';
var reg = /(ab)+(c)+/gi;
console.log( str.match(reg) )

整体或着 |
/acb|d/ 表达的意思 是abc或着d 匹配abc 或着d
var str = 'abcfd-fjf';
var reg = /abc|d/g;
console.log( str.match(reg) )

如果要匹配 abc 或着 abd
var str = 'abdfdabc-fjf';
var reg = /ab[cd]/;
var x = str.match(reg);
console.log( x )

var str = 'abdfdabc-fjf';
var reg = /ab(cc|d)/g; //abcc 或 abd
var x = str.match(reg);
console.log( x )
