JS正则表达式(1):正则表达式组成

119 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

正则表达式

regular expression : RegExp : 是用来处理字符串的规则, 只能处理字符串

正则的主要用途:

  1. 验证字符串是否符合某个规则 ( test )
  2. 把字符串中符合规则的内容捕捉 ( exec / match ... )
let str1 = 'today is good, hahaha, l have let it go';
let str2 = '1 is good, 2, l have let it go 3';

// 正则式用来指定规则的 (test方法用来验证, \d+表示有没有连续的数字, 1个数字也算)
let reg = /\d+/;
reg.test(str)	// => false

// 正则式用来捕获字符 (exec/match进行捕获)
reg.exec(str2) // => Array: [0: '1', index: 0, input: '1 is good, 2...']

创建正则表达式


方法一: 字面量

let reg = /\d+/;

方法二: 构造函数

// => 构造函数模式创建  需两参数: 元字符字符串(特殊字符需要转移), 修饰符字符串
let reg = new RegExp('\\d+', 'i');

两种方式的区别

在JavaScript字符中, 也有转义字符, 比如 "\n"是换行, "\t"是一个制表符等等

  1. 如果使用 new RegExp的方式创建, 必须把字符串中的转义字符进行转移, 才能创造除字符串对象, 不然传入的就是一个换行, 或者是四个空格
  2. 使用 / / 的方法创建, JS会帮我们进行处理, 把其看待成元字符, 所以可以直接写 \d, \w等

方法二的独特之处

// 如果我们想把变量(不确定值), 作为正则表达式的匹配规则, 其内容会变化

let name = '我是正则'
let reg = /^\d+name\d+$/i													// 无法做到
reg = new RegExp(`^\\d+${name}\\d+$`, 'i')			// 完美胜任
console.log(reg.test('123我是正则456'))	// => true
console.log(reg.test('aan我是正则456'))	// => false

正则表达式组成

元字符


量词元字符

用来设置出现的次数

  1. * 代表 0 ~ ∞
  2. + 代表 1 ~ ∞
  3. ? 代表 0 或 1
  4. {n} 代表出现 n
  5. {n,} 代表 n ~ ∞
  6. {n,m} 代表 n ~ m

特殊元字符

单个或者组合在一起代表的特殊含义

单个

  1. \ 转义字符 ( 普通 => 特殊 => 特殊 )
  2. . 可以代表除 \n ( 换行符 ) 以外的任意字符
  3. ^ 以哪一个元字符匹配作为开始
  4. $ 以哪一个元字符匹配作为结尾
  5. | 逻辑或字符, | 的左右两边规则都使用, \d | \ s ( 匹配一个数字或者一个空格 )
  6. [] 成员字符, 在 [ ] 中出现的的字符, [ 0-9a-z ] ( 匹配一个字符, 范围式0-9 小写字母a-z)

多个

  1. \n 换行
  2. \t 制表符 ( 一个Tab, 相当于4个空格 )
  3. \b 匹配一个单词的边界
  4. \d 0 ~ 9 之间的一个数 \D0 ~ 9 之间的一个数
  5. \w 数字, 字母, 下划线中任意一个 \W数字, 字母, 下划线中任意一个
  6. \s 空白字符( 空格丶制表符丶换页符等 ) \S空白字符( 空格丶制表符丶换页符等 )
  7. [a-z] 指定范围, 范围为 a ~ z 内的任意字符 [0-9a-zA-Z_] === \w
  8. [^0-9a-z, ] [^] 代表除了[]中的任意字符, ^为非的意思, 这里指除了 09 az 逗号 空格外的字符
  9. () 分组符号
  10. (?:) 只匹配不捕获
  11. (?=) 正向预查
  12. (?!) 负向预查

普通元字符

代表本身字符串的含义, a就是a, b就是b

let re = /today is good, hahaha, l have let it go/;
let str1 = 'today is good, hahaha, l have let it go';
let str2 = 'today is good, hahaha, l have let it';
re.test(str1)		// => true
re.test(str2)		// => false

修饰符

正则表达式常用的修饰符有三种 : img

  1. i => ignoreCase 忽略大小写匹配

  2. m => multiline 可以进行多行匹配

  3. g => global 全局匹配

    		let re1 = /AB/;			// 不忽略大小写匹配
    		let re2 = /AB/i;		// 忽略大小写匹配
    		let str = 'ab   ab'
    		console.log(re1.test(str))	// => false
    		console.log(re2.test(str))  // => true