正则表达式简介及工具

正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为”元字符”)。
正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。

  • 在线表达式转换为图形工具 https://regexper.com
  • 编辑器查找功能打开”.*”正则匹配功能

RegExp对象

实例化RegExp对象的两种方式

  • 字面量 var reg = /\bis\b/g;
  • 构造函数 var reg = new RegExp('\\bis\\b','g');

修饰符

  • g:global,全文搜索,不添加,搜到第一个匹配就停止
  • i: ignore case,忽略大小写,正则默认大小写敏感
  • m: multiple lines 多行搜索

'He is a boy. Is he?'.replace(/\bis\b/gi,'isn't)

元字符

具有特殊含义的字符被称为元字符,例如\b \n . * + ? $ ^ \ | () {} []等等

字符类

元字符[]来构建一个类,例如[abc]把字母a,b或c归为一类

'a1b2c3d4'.replace(/[abc]/g,'X') //"X1X2X3d4"

字符类取反

中括号里面加一个上箭头,例如[^]

'a1b2c3d4'.replace(/[^abc]/g,'X') //"aXbXcXXX"

范围类

[a-z]代表a到z的所有字母,包含a和z。 [a-zA-Z]所有大小写字母 [0-9]代表所有的数字 如果要匹配横线可以后面再写一个横线[0-9-]结果就可以匹配’2017-05-15′

预定义类

字符 等价类 含义
. [^\r\n] 除了回车和换行之外的所有字符
\d [0-9]] 数字 digit
\D [^0-9] 非数字
\s [\t\n\x0B\f\r] 空白符 spacing
\S [^\t\n\x0B\f\r] 非空白符
\w [a-zA-Z_0-9] 单词(字母、数字下划线) word
\W [^a-zA-Z_0-9] 非单词字符

边界

字符 含义
^ 以xxx开始 ‘@123@abc@’.replace(/^@./g,’X’) //”X23@abc@”
$ 以xxx结束 ‘@123@abc@’.replace(/..@$/g,’X’) //”@123@aX”
\b 单词边界 boundary
\B 非单词边界

量词

如果要匹配3个数字就要写\d\d\d,如果是100个就很麻烦,所以 \d{100}

字符 含义
? 出现0或1次
+ 1或n次
* 0或n次
{n} n次
{n,m} n到m次
{n,} 至少n次

贪婪模式

12345678 如果用{3,6} 就会按照最大值匹配,结果为123456

非贪婪模式

如果不想使用默认的贪婪模式规则,在量词{}后面加上? 例如12345678的正则{3,6}?,结果为123

分组

Richard{3} 匹配的是d重复3次,(Richard){3}是Richard重复3次

Richard | Tom 匹配的Richard或Tom 默认边界是头尾,所以要用()分组,例如Ricahr(d|T)om

反向引用

$1 代表第一组

'2016-1-13'.replace(/(\d{4})-(\d{1,2})-(\d{1,2})/g,'$2/$3/$1') //"1/13/2016"

前瞻

正则表达式从文本头部向尾部解析,尾部方向称为“前”,js不支持后顾 语法 exp(?=assert)和exp(?!assert) 正则和断言
'a2*3'.replace(/\w(?=\d)/g,"x") //"x2*3"

正则对象的属性

global、 ignore case、 multiline、 lastIndex、 source

正则对象的方法

    • RegExp.prototype.test(str) 返回匹配结果的一个布尔值
  • RegExp.prototype.exec(str) 返回匹配结果的一个数组

exec和match方法很像,搞清楚区别最好的方式就是正则里面有没有全局g属性,简单的说exec每次只匹配一次,match是可以全局匹配的

var str= "cat,hat" ;
var p=/at/; //没有g属性
console.info(p.exec(str))
console.info(str.match(p))```

> ["at", index: 1, input: "cat,hat"]
> ["at", index: 1, input: "cat,hat"]

var str= "cat,hat" ;
var p=/at/g; //有g属性
console.info(p.exec(str))
console.info(str.match(p))

> ["at", index: 1, input: "cat,hat"]
> (2) ["at", "at"] 

字符串对象与正则有关系的方法

  • search() 找到就显示位置,有点像indexOf() 找不到返回-1
  • match() 会把结果返回为一个数组,没找到返回null 注意正则表达式中的/g全局属性影响结果 如果不是全局,那么返回结果中的数组会把分组信息带上
  • split() ‘a,b|c’这种情况可以把正则写到函数里面去匹配,和|
  • replace () 最常用,而且参数支持函数,以写出强大的匹配规则
转载请注明来自:爱前端

发表评论

电子邮件地址不会被公开。 必填项已用*标注