正则

·  阅读 104

正则

正则是什么

正则是处理字符串的一种规则 JS中的正则具体体现出来是一种数据类型 RegExp ,是一种引用数据类型数据

JS编写正则的两种方式

  1. 字面量的实例形式:
var reg = /q/
复制代码
  1. new 的方式创建

涉及到变量时候会偶尔用new的方式创建正则,一般都是字面量的方式

var reg = new RegExp('q')
复制代码

正则一般有两种用途

  • 用于匹配 test
    • 编写一个正则,看对应的字符串是否符合该正则
  • 用于捕获 exec
    • 编写一个正则,可以把对应字符串中的符合规则的部分获取到

正则的组成结构

正则双斜杠中的内容 我们称为元字符,斜杠外边的内容我们称为修饰符 常用的元字符可以分为 有特殊含义的元字符量次元字符 普通元字符

元字符

有特殊含义的元字符
  • \ :转义
  • \d :0~9之间的数字
  • \D:除0~9以外的字符
  • \w :代表数字 字母 下划线
  • \W :除数字 字母 下划线以外的字符
  • ^:代表以什么字符开头
  • $:代表以什么字符结尾
  • . :代表 除了换行符以外的所有的字符
  • \n :换行符
  • x|y :字符x 或者字符y(x和y可以是多个字符)
  • [ab] :代表字符a或者字符b(a和b只能是单个字符)
  • [^ab] : 代表非a b
  • [a-z] :代表a-z之间任意字符 小写字母
  • [^a-z] :代表除了小写字母
  • () :分组和提升优先级
  • (?:) :非捕获匹配
  • (?=)
  • (?!)
量词元字符
  • ? :前边的字符出现了 0 或者 1 次
  • +: 前边的字符出现了 1 或者 多次
  • * : 代表的字符出现了 0 或者多次
  • {n} :前边的字符出现了至少连续的n次
  • {n,m}: 前边的字符出现了n 到 m 次
  • {n,} : 前边的字符出现了 n 到多次
修饰符
  • i :忽略大小写 ignoreCase
  • m : 多行匹配 mutiline
  • g : 全局匹配 global
 var str = '2019-9-23';
    // str = str.replace(/-/g, '/');
    console.log(str.replace(/-/g,'/'));
    var ary = ['qqq', 'www', 'yyy'];
    var arr = ary.map(item => new RegExp(item)) ;
    console.log(arr);
复制代码

正则匹配

写一个正则 去匹配字符串,字符串中有符合正则 的字符就返回true,否则就返回false

<script>
    var reg = /d/;//匹配字符串中的d 
    console.log(reg.test('nnj07vgh'));//false
    console.log(reg.test('ndjjkjk'));//true

    var reg = /\d/;
    console.log(reg.test('jjsjkj'));//false
    console.log(reg.test('9bbjh'));//true

    var reg = /\d{2}/;//至少出现连续的两个数字
    console.log(reg.test('9'));
    console.log(reg.test('99'));
    console.log(reg.test('jknk0bhj'));
    console.log(reg.test('jknk0865bhj'));
    
    var reg = /\\d/;//第一个\代表转义把第二个\转成了不具有转义意义的字符\ 正则的意思就是匹配字符\d
    console.log(reg.test('99h'));//f
    console.log(reg.test('bhj\ddd98yv'));//f
    console.log(reg.test('\\d'));//t

    var reg = /^\d.123$///以数字开头以3结尾 3前边是个12 12前边是一个除了换行符以外的任意字符
    console.log(reg.test('8\n123'));
    console.log(reg.test('8.123'));
    console.log(reg.test('8n123'));
    
    var reg = /^\d\.123$/;//. 不再代表正则中除了换行符以外的任何 而是只代表一个普通字符.  此正则代表以任意数字开头 以3结尾 中间是.12
    console.log(reg.test('3.123'));
    console.log(reg.test('5n123'));

var reg = /[a-c]/; //  只要有一个 a或者b或者c ; 结果就是true
console.log(reg.test('aqweaqe'))
var reg = /^[a-c]/; //  只要以 a或者b或者c  开头的字符串; 结果就是true
var reg = /^[a-c]{2}/; //  只要以 a到c之间的任意两个字符开头的字符串 结果都是true;

var reg = /[a-z0-9]/; // 小写字母和数字
var reg = /[0-9a-z]/;// 小写字母和数字
var reg = /[0-9a-zA-Z_]/; // \w

var reg = /[.]/ // 中括号中的点 代表 点 本身;
var reg = /^18|19/;//以18开头 或者有19;或的优先级高
var reg = /18|19$/;//含有18 或以19结尾
var reg = /^18|19$/;//以18开头  或以19结尾
var reg = /^(18|19)$/;//18   19/^1[89]$/
</script>
复制代码

正则匹配

  • 匹配有效数字

有效数字:可以有正负号,可以有小数部分,整数部分不能以0开头

var reg = /^[-+]?([1-9]\d|\d+)(\.\d+)?$/
复制代码
  • 身份证

前边6位行政区号 4位年份2位月份2位天,最后一位可能是随意数字 也可能是X

 let reg=/^\d{6}(\d{4})(\d{2})(\d{2})\d{2}(\d)(\d|X)$/;\d[\d|X]/
复制代码

正则捕获

reg .exec(str) :从字符串中获取 满足正则的字符

var reg = /\d+/;
var str = 'hello2019hello2020';
console.log(reg.exec(str));
复制代码

exec 捕获结果 :exec的返回结果是一个数组 第一项是大正则捕获的内容,第二项及以后是小分组捕获到的内容 第二项式第一个小分组; 第三项是第二个小分组 若字符串中没有任何符合正则的内容 ,则获取到的内容就是一个null

var reg = /([a-z]+)(\d+)/
var str = 'hello2019hello2020';
console.log(reg.exec(str))
复制代码

正则的贪婪性

一次性会把所有满足正则的字符都捕获到 解决正则的贪婪性:加?

var reg = /\d+?/;
var str = 'hello2019hello2020';
console.log(reg.exec(str));
复制代码

正则的懒惰性

只捕获一次,不再不厚其他符合正则的字符 通过添加全局修饰符g 解决;

每一个正则都有一个lastIndex属性,不加全局修饰符g 的时候,lastIndex 的 值是0;加了g之后,每次匹配或者捕获都会更新lastIndex值,下一次捕获的lastIndex是 上一次捕获结束的位置

加上g之后,每次捕获时都会更新lastIndex 属性 lastIndex属性控制的是下一次开始匹配的起始索引 test 和 exec都会更新lastIndex属性

var reg  =/([a-z]+)(\d+)/g;
var str = 'bye2019hello2020';
console.log(reg.exec(str));
console.log(reg.exec(str));
复制代码

字符串的match方法

match方法是配合正则使用,用于捕获符合正则的字符

 var reg = /([a-z]+)(\d+)/
    var str = 'ff2019ff2020';
    console.log(reg.exec(str));
    console.log(str.match(reg));
复制代码

在不加全局修饰符g的时候,match和exec捕获到的内容一致

var reg = /([a-z]+)(\d+)/g;
    var str = 'zf2019zf2020';
    console.log(reg.exec(str));
    console.log(str.match(reg));
复制代码

正则加了全局修饰符g ,用match方法去捕获字符串的时候,只捕获大正则到的内容,会忽略小分组的内容

字符串的split方法

split方法可以把字符串转成数组,用法:用括号中的参数去切割字符串,把分割的两部分放到数组中,可以配合正则使用

var str = '2019-09-30';
var res = str.split(/\-/g);
console.log(res);//=>['2019','09','30']
复制代码

字符串的replace方法

replace 方法是把字符串的xxx换成xxx2。replace方法有两个参数,第一个参数可以是字符、正则,第二个参数可以是字符或者回调函数

replace中的回调函数的实参结果跟match 和exec 方法获取到的内容类似,返回的字符串是由匹配到的内容被return值 替换之后的新字符串,回调函数的执行次数跟正则匹配到的次数一致,有多少个满足的就会执行几次

var str = '2019ff2020jy09';
var res = str.replace(/(\d+)([a-z]+)/g,function(){
	console.log(arguments);
})
复制代码
var str = '1+2+3+4+5';
var res = str.replace(/\+/g,function(){
	return =;
});
console.log(res);//=>'1=2=3=4=5'
复制代码
var str = 'wer2312gsgsd345sdfgs345qwe324'
var res = str.replace(/([a-z]+)(\d+)/g,'$1===$2===').replace(/=+$/,'');
// $1  $2  $3 ... 分别代表第一个小分组第二个小分组;
console.log(res)
复制代码
分类:
阅读
标签:
分类:
阅读
标签:
收藏成功!
已添加到「」, 点击更改