js正则表达式(regular expression :RegExp
)
正则的作用和使用方法
- 用来处理字符串的规则
- 只能处理字符串
- 它是一个规则:可以验证(text方法)字符串是否符合某个规则,也可以把字符串中符合规则的内容捕获(exec方法)
- 使用方法
var reg = new RegExp() reg = /\d+/ // 这就是一个正则表达式
- 创建正则的两种方式以及区别
- 通过字面量方式(两个斜杠包裹的用来描述正则规则的元字符就是正则)
let reg = /\d+/
- 通过构造函数创建正则,它有两个参数:元字符字符串,修饰符字符串,
let reg2 = new RegExp("\\d+")
- 他们之间的区别
- 用构造函数创建的正则中 元字符中的\需要转义
- 用构造函数创建的正则中,可以存在变量
var type = 'aaaa' reg = /^@+type+@$/ // 这里面的type不是一个变量 new RegExp('^@'+type+'@$') // 这里面的type就是变量type的值’aaaa‘
正则中的方法
- RegExp 对象是带有预定义属性和方法的正则表达式对象
test()
它通过模式来搜索字符串,然后根据结果返回 true 或 false。var str = 'hello word' var reg = new RegExp() reg = /\d+/ console.log(reg.test(str));
exec()
它通过指定的模式(pattern)搜索字符串,并返回已找到的文本。如果未找到匹配,则返回 null。var reg = new RegExp() reg = /\d+/ reg.exec('dffsd1') // ["1", index: 5, input: "dffsd1", groups: undefined] // 返回值是一个数组,数组中包括找打内容的索引,以及原始字符串
正则表达式的两部分
元字符
如果字符串中有\的话 需要转义一下,因为字符串中的\默认就是转义字符
let reg = /2.3/
- 量词元字符
+
一到多次*
零到多次?
零次和一次{n}
出现n次{n,}
出现n到多次{n,m}
出现n到m次
- 特殊元字符
\
转义字符(普通-特殊-普通).
除\n以外的任意字符^
以哪一个元字符作为开始
- 组合元字符
\n
除换行符以外的任意字符\d
0~9之间的任意一个数字\D
非0~9之间的数字\w
数字字母下划线中的任意一个字符\W
非数字字母下划线中的任意一个字符\s
一个空白字符(包括空格,制表符【一个tab键】,换页符)\t
一个制表符\d
匹配一个单词的边界x|y
x或者y中的字符[xyz]
xyz三个中的任一个字符[^xy]
非x或者y中的字符[a-z0-9A-Z_]
代表数字字母下划线中的任一个字符 等于/w
()
正则中的分组符号(?:)
只匹配不捕获(?=)
正向预查(?!)
反向预查
修饰符
i
忽略单词大小写匹配m
进行多行匹配g
全局匹配
使用正则元字符时会出现的一下问题
- 使用y|x出现的问题
// x|y会存在一个优先级问题 reg = /^18|19/ reg.test('18') // true reg.text('19') // true reg.text('181') // true reg.text('1219') // true reg1 = /^(18|19)/ reg1.test('18') // true reg1.text('19') // true reg1.text('181') // false reg1.text('1219') // fase
- 使用[],中括号中出现的字符一般都代表本身的含义,但又有些意外
reg = /^[@+]$/ // 这里的[@+]代码字符@和字符+的任意一个 reg = /^[\d]$/ // 这里的[\d] 代表的就是0-9之间的任意一个数字 reg = /^[10-29]/ // 代表的是1或0-2或9 并不是10-29之间的一个数字
常用的正则表达式
- 验证是否是有效数字
// 可能会出现+ - 号 [+-]? // 一位数字首位可能为0 ,多位数字首位不能为0 (\d|([1-9]\d+)) // 小数部分 (\.\d+)? let reg = /^[+-]?(\d|([1-9]\d+))(\.\d+)?$/
- 验证密码
// 数字字母下划线 6~16位 let reg = /^\w{6,16}$/
- 验证真实姓名
// 汉字的正则表达式 /^[u4e00-u9FA5]$/ // 汉字长度2-10 // 可能存在有 名字·名字的类型(音译名) let reg = /^[u4e00-u9FA5]{2,10}(.[u4e00-u9FA5]{2,10}){0,2}$/
- 验证邮箱的正则表达式
let reg = /^\w+((-\w+)|(\.\w+))*@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/
- 身份证号码的正则表达式
- ()分组捕获,并且可以单独获得每个分组的内容
let reg = /^(\d{6})(\d{4})(\d{2})(\d{2})\d{2}(\d)(\d|X)$/ reg.exec('412723199412351241') // 得到的就是一个数组["412723199412351241", "412723", "1994", "12", "35", "4", "1", index: 0, input: "412723199412351241", groups: undefined]
正则的捕获(以及分组捕获)
- 实现正则捕获的前提是:当前正则要和字符串匹配,如果不匹配捕获的话那就返回null
- 基于exec()这个方法实现正则的捕获,返回的结果是一个null或者是一个数组
- 数组中的第一个内容就是捕获到的内容
- 如果有分组
()
的话,后几项就是分组捕获的内容 - 然后数索项,返回捕获的整体整容的索引
- 然后是我们操作的字符串
reg = /(\d)(\d)(\d)/ //分组捕获’ reg.exec('123') // 上面分组捕获得到的数组 ["123", "1", "2", "3", index: 0, input: "123", groups: undefined]
- 每执行一次exec()只能捕获到一个符合正则规则的,就是执行100遍也只捕获第一个,这就是正则捕获的懒惰性(解决办法用全局修饰符g)
//懒惰性解释 var str = 'a12a21a' reg = /a/ reg.exec(str) // 如果我们需要捕获str中的所有a,那么我们使用exec进行捕获的时候,只能拿到第一次捕获的 // 正则有一个索引为lastIndex:当前正则下一次匹配的起始索引位置,而产生懒惰性的原 //因就是lastIndex永远不会自动改变,它默认一直都是0就是说他无论执行多少次,他都是 //从索引0开始捕获 // 但是如果我们给正则使用修饰符g的时候。可以改变lastIndex的值
来源:CSDN
作者:mengweizhao
链接:https://blog.csdn.net/mengweizhao/article/details/103920819