正则
正则是一个字符串的处理规则。
js中的正则是一种引用数据类型:RegExp
正则的编写方式有两种,1:字面量 2: new RegExp(‘zhufeng’) 正则是一个引用数据类型。
正则的两种用途:1,用于匹配 test 编写一个正则或者说(制定了一种规则,去测试某个字符串是否匹配这种规则) 2.用于捕获 exec 编写一个正则(指定了个规则)去把字符串中符合这个规则的字符串获取到。
<script>
// var reg=/zhufeng/; 斜杠中的字符 我们称作元字符:
// 常用的元字符:1.有特殊含义的元字符 2.普通元字符
// 有特殊含义的元字符:\d 代表0-9之间的数字
// \D 除了0-9以外的任意字符
// \w 代表数字,字母,下滑线, 稍微比\D大一些
// \W 除了数字,字母,下滑线的任意字符
// ^ 以什么字符开头
// $ 以什么字符结尾
// . 除了换行以外的所有字符
// \n 代表换行
// \u4E00-\u9FA5 代表中国汉字
// 在正则中,‘|’代表或者,例子:x|y x或者y
// [xyz]也代表或者 但是只能代表单个字符 x或者y或z
// [^xy] 除了xy的任意字符 (加^代表取非)
// [a-z] a到z的任意字符,小写的英文字母
// [^a-z] 除了a到z 的任意字符
// () 分组和提升优先级
分组的三大作用:
1.改变优先级
2.分组捕获(不仅捕获大正则匹配的结果,而且还能把每一个小分组匹配的结果捕获到)
3.分组引用
// (?:) 只匹配不捕获
// (?=) 正向肯定预查
// (?!) 正向否定预查
// 量词元字符
? 前面的字符连续出现0或者1次;
问号在正则表达式中的含义:
1. 本身是量词元字符
/A?/ 让A出现零到一次
2. 取消正则捕获的贪婪性(它本身放到一个量词元字符的后面)
/\d+?/ 按照当前正则最短的匹配的结果来捕获
3. ?: 出现在分组中,让当前分组只匹配不捕获
4. ?= 正向预查
5. ?! 负向预查
+ 前面的字符连续出现1或者多次
* 前面的字符连续出现0或者多次
{n} 前面的字符连续出现n次
{n,m} 前面的字符连续出现n到m次
{n,} 前面的字符连续出现n到多次
//修饰符,用在正则外面
i ignoreCase 忽略大小写
m mutiline 多行匹配
g global 整个字符串都匹配一遍,全局匹配
</script>
####正则的练习
正则的原型上面有我们想用的方法 test exec
var str='珠峰666';
先用来匹配
var rag = /\d/ =>用来匹配0-9的数字 (只要字符串中含有数字即可)
console.log(reg.test(str)) => 返回的是ture
console.log(rag.test('adjlkfjalksj12asd')) => 返回的是 ture
var reg= /\d?/ 代表数字出现0次或者1次 有数字也行没有数字也可以
console.log(rag.test('adjlkfjalksj12asd')) =>ture
var reg= /\d{2,3}/ 代表前面的数字连续出现2到3次
console.log(rag.test('adjlkfjalksj12asd')) =>ture
console.log(rag.test('asd')) =>false
console.log(rag.test('a123ksj12asd')) =>ture
var reg=/^\d$/ 以一个数字开头,还以这个数字结尾,只能匹配单个数字
//正则中又 /^ $/ 正则中必须全部满足正则
console.log(rag.test('asd')) =>false
console.log(rag.test('a123ksj12asd')) =>false
console.log(rag.test('adjlkfjalksj12asd')) =>false
console.log(rag.test('1')) =>ture
var reg=/^\d{2,3}$/ 这个正则只能是两到三个数字了
console.log(rag.test('asd')) =>false
console.log(rag.test('a123ksj12asd')) =>false
console.log(rag.test('adjlkfjalksj12asd')) =>false
console.log(rag.test('1')) =>false
console.log(rag.test('123')) =>ture
var reg2=/^\d+\w+\d+$/ 代表以多个数字开头,并且以多个数字结尾,中间是一到多个数字,字母下划线。
var reg2=/^\d\w+\d+$/ 以一个数字开头,以多个数字结尾,中间是多个字母,数字
var reg=/[a-c]/ 有a到c中的任意一个字符 有就是ture
//中括号里面的代表的是一个整体,
console.log(rag.test('asd')) =>ture
console.log(rag.test('a123ksj12asd')) =>ture
console.log(rag.test('adjlkfjalksj12asd')) =>ture
注意:A-z中间 有6个特殊的字符 这个是对应其ASCll
注意:在中括号中的.只代表.本身没有特殊的含义了 [.] 除了. 还有量词元字符, |
var reg=/^[a.c]$/ 该正则只能匹配(‘a’)('.')(’c‘)
var reg=/^a.c$/ 该正则匹配3个字符 以a开头以c结尾,中间可以是除折行外的其他字符
var reg=/18|19/ 改正则能匹配含有18 或者 19 就可以
reg.lastINdex 的值是下一次捕获的起始索引 ,,exec 和test的方法可以改变lastIndex的值。
在正则中有几次符合条件的就可以运行几次exec,进行捕获。
#####正则的捕获
匹配 test
捕获 exec 就是把字符串中符合正则规则的部分 获取到
1.贪婪性 解决方法:加一个单个的问号 ’?‘ reg= /\d+?/
2.懒惰性 解决方法:在正则后面加一个 g reg= /\d+?/g
()在匹配的时候一般是来提升优先级的,而在捕获的时候起到的是分组的作用
var reg=/([a-z]+)(\d+)/
正则捕获的时候第一项是我们正则的整体捕获,如果有小括号,那么第二项就是小括号里面所捕获的内容。
把量词放在分组外面的这种情况,小分组最后捕获的是最后一次满足的情况。
小规律:先总后分 -> 先左后右 -> 由外到里
var reg = /\d{6}(\d{4})(\d{2})(\d{2})\d{2}(\d{1})/i
console.log(reg.exec('130722199609150516'))
这个可以捕获到一个数组
//做一个ulr获取的方法放再一个对象里面
//match split replace 跟正则的结合使用
//获取一个字符串中出现最多的字符 以及次数
var str='asdasdadgfgfdvcwwevvcv'
//2.实现一个千分符的函数
’1316322135413115‘ ’131,136,654,656,621‘
//3.结合replace实现 queryParams
#####match 方法的使用
- 在字符串中使用
- str.match(searchvalue) 参数解析: (1).searchvalue:必需,规定方法要检索的字符串。 代码实例: let str="antzone"; console.log(str.match("n")); 代码运行效果: ["n", index: 1, input: "antzone", groups: undefined]
对上述代码运行结果分析如下: (1).match方法在有匹配结果的时候返回值是一个数组。 (2).数组第一个元素是match方法首次匹配到的子字符串,"antzone"虽然有多个"n",但是返回的数组只存储首次匹配到的"n",如果match方法的参数是全局匹配的正则,将会存储所有的匹配到的子字符串。 (3).index属性值返回首次匹配到子字符串的位置。 (4).input属性值是原字符串"antzone"。 (5).groups属性当前并不被支持,暂时不做介绍。
let str="antzone"; console.log(str.match("zon")); 代码运行效果: ["zon", index: 3, input: "antzone", groups: undefined]
首次匹配到子字符的位置,以子字符串的首字符在原字符串位置为准。 字符串与数组类似,字符位置从0开始计算,也就是第一个字符的位置为0,第二个位置为1,以此类推。
let str="antzone"; console.log(str.match("蚂蚁")); 代码运行效果:
null
如果匹配不到任何内容,方法返回值为null。
- 在正则中使用
- 一.非全局匹配: 所谓非全局匹配,也就是使用g修饰符 此时,match方法最多只在字符串中成功匹配一次: (1).如果不存在匹配的子字符串,返回null。 (2).如果存在匹配的子字符串,返回一个数组。 返回的数组解析如下: 首先说明一下,数组元素的索引是从0开始的。 (1).第0个元素是匹配结果。 (2).第1个元素是第一个引用型分组匹配的子字符串。 (3).第2个元素存放的是第二个引用型分组匹配的子字符串,依次类推。 返回的数组对象同时具有两个属性: (1).index:返回匹配的子字符串起始字符在stringObject源字符串中的位置。 (2).input:返回stringObject源字符串。
二.全局匹配: match方法执行全局匹配,获取所有可以匹配的子字符串: (1).如果不存在匹配的子字符串,返回null。 (2).如果存在匹配的子字符串,返回一个数组。 与非全局匹配的区别: (1).不具有index和input属性。 (2).不具有引用型分组匹配的子字符串,数组元素仅包含匹配的所有子字符串。
#####split 方法的使用
#####replace 方法的使用 1.基础用法,第一个参数为字符串
var str="cat bat fat";
var result=str.replace("at","ond");
console.log(result); //cond bat fat
2.第一个参数为RegExp对象
var str="cat bat fat";
var result=str.replace(/at/g,"ond");
console.log(result);//cond bond fond
3.颠倒
var str="ouyang,zhaoyu";
var result=str.replace(/(\w+),(\w+)/,"$2,$1");
console.log(result);//zhaoyu,ouyang
4.与正则表达式匹配的全文本
var str="ouyang,zhaoyu";
var result=str.replace(/(\w+)/,"$&-$&");
console.log(result);//ouyang-zhaoyu
5.匹配匹配字符串的右边字符
var str="ouyang";
var result=str.replace(/ou/,"$'");
console.log(result);//yangyang
当replace第二个参数为函数时
var str="ababdd";
str.replace(/(b)(d)/g,function(){
console.log(arguments);// ["bd", "b", "d", 3, "ababdd"]
})
函数的参数依次为:1、整个正则表达式匹配的字符。2、第一分组匹配的内容3、第二分组匹配的内容....以此类推到最后一个分组;3、此匹配在源字符串中的下标;4、源字符串;
var str="aaa bbb ccc";
var result=str.replace(/\b\w+\b/g,function(word){
return word.substring(0,1).toUpperCase()+word.substring(1);
})
console.log(result);//Aaa Bbb Ccc
————————————————
#####转义字符的使用
- 转义字符,\ 可以把字符转义成本身
- \ 转义:一个是正则中的转义,一个是字符串中的转义
- 在正则中有特殊含义的字符,转义成字符本身。例如:. + ?
- 字符串中的转义也是把有特殊含义的字符转义从字符本身。 例如: '' "" \