likes
comments
collection
share

JS中的正则

作者站长头像
站长
· 阅读数 60

正则是什么

正则是处理字符串的一种规则 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 捕获结果 : 第一项是大正则捕获的内容,第二项及以后是小分组捕获到的内容 第二项式第一个小分组; 第三项是第二个小分组 若字符串中没有任何符合正则的内容 ,则获取到的内容就是一个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 解决; 加上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));
转载自:https://juejin.cn/post/6844903954720129038
评论
请登录