正则

291 阅读6分钟

正则

正则是一个字符串的处理规则。

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  的值是下一次捕获的起始索引 ,,exectest的方法可以改变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

————————————————

#####转义字符的使用

  • 转义字符,\ 可以把字符转义成本身
  • \ 转义:一个是正则中的转义,一个是字符串中的转义
  • 在正则中有特殊含义的字符,转义成字符本身。例如:. + ?
  • 字符串中的转义也是把有特殊含义的字符转义从字符本身。 例如: '' "" \