javaScript的正则表达式详解

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。使用好正则表达式可以节省大量的代码。

先从简单的案例体验下正则

/abc/.test("51abcd23");//true
/\d\d\d/.test("12ab");//false
/\d\d\d/.test("123ab");//true

new RegExp("Frankin").test("hello,Frankin");//true

以上定义了两种正则调用的方法,当校验规则是字符串的时候很好理解,就是被校验的字符串里是否含有校验规则的字符串,如果包含的话返回true,反之校验失败返回false,并且大小写敏感,而\d这种特殊的语句规则又是什么呢?\d其实代表匹配0-9的数字,而这种匹配规则还有很多,我们可以看下图。

常用元字符串:

语法 描述 例子
. 任意字符(除换行符外:\n,\r,\u2028 or \u2029) /.../.test('1a@');
\d 数字0-9 /\d\d\d/.test('123');
\D 非\d,即不是数字0-9的字符 /\D\D\D/.test('ab!');
\w 数字0-9或者字母a-z及A-Z(大小写),或下划线 /\w\w\w\w/.test('aB9_');
\W 非\w /\w\w\w/.test('@!#');
\s 空格符、TAB、换页符、换行符 /\sabc/.test(' abc');
\S 非\s
\t \r \n \v \f tab 回车 换行 垂直制表符 换页符

范围符号:

语法 描述 例子
[...] 字符范围 [a-z] [0-9] [A-Z0-9a-z_]
[^...] 字符范围以外 [^a-z] [^abc]
^ 行首 ^Hi
$ 行尾 test$
\b 零宽单词边界 \bno
\B 非\b

这里可能\b 零宽单词边界比较难理解,这里重点解释下

当我们需要把一句 This is a test这句话的is 替换成 IS时,如果直接匹配is,会把This后面的is也给替换掉,这时使用单词边界\bis\b来匹配,便可以只匹配is而不匹配This了

当我们刚好要匹配^或者$这些带有范围符号规则的字符时,该怎么办呢?

这时就需要用转义字符\来声明 不做别的范围匹配作用 例如^

/\^abc/.test('^abc');//true

分组:

语法 描述 例子
(x) 分组,并记录匹配到的字符串 /(abc)/
\n 表示使用分组符(x)匹配到的字符串 /(abc)\1/.test('abcabc');
(?:x) 仅分组 /(?:abc)(def)\1/.test('abcdefdef');

这里讲解下(x)和(?:x)的区别

当使用(x)分组时,使用\n重新匹配第n个分组

当只想将复杂的表达式分组,而不记录被/n调用时,使用(?:x)便不会记录匹配到的字符串

/(abc)(def)\1/.test('abcdefabc');//true
/(?:abc)(def)\1/.test('abcdefabc');//false
/(?:abc)(def)\1/.test('abcdefabc');//true

'2016-11-25'.replace(/(\d{4})-(\d{2})-(\d{2})/,'$2/$3/$1');
//"11/25/2016"

重复:

语法 描述 例子
x* x+ 重复次数>=0 重复次数>0 贪婪算法 正则表达式: abc*将匹配ab、abc、abcccccc<br />正则表达式:abc+将匹配abc、abccccc、却匹配<u>ab</u>
x*? x+? 同x*,x+,非贪婪算法 正则表达式: abc*?在字符串abcccccc将匹配ab<br />正则表达式:abc+?将匹配abc
x? 出现0或1次
x|y x或者y x|y匹配x,也匹配y<br />再比如:ab|cd|ef匹配ab或cd或e f
x{n} x{n,} x{n,m} 重复n次,重复>=n次,重复次数x满足:n<=x<=m x{5}匹配xxxxxoo,不匹配xxo<br />x{1,3}匹配x,xx,xxx

前瞻

前瞻就是在正则表达式匹配到规则的时候,向前检查是否符合断言

js不支持后顾

名称 正则 含义
正向前瞻 exp(?=assert)
负向前瞻 exp(?!assert)
正向后顾 exp(?<=assert) javaScript不支持
负向后顾 exp(?<!assert) javaScript不支持
'a2*3'.replace(/\w(?=\d)/g,'X');
//"X2*3"
'a2*34v8'.replace(/\w(?=\d)/g,'X');
//"X2*X4X8"
'a2*34vv'.replace(/\w(?=\d)/g,'X');
//"X2*X4vv"
'a2*34vv'.replace(/\w(?!\d)/g,'X');
//"aX*3XXX"

Flag、RegExp对象属性

  • global--g (全文匹配)
  • IgnoreCase--i (忽略大小写)
  • Multiline--m. (多行搜索)
  • source (正则表达式的文本字符串)
  • lastIndex (是当前表达式匹配内容的最后一个字符的下一个位置)
var reg = /\bis\b/;
//或
var reg = new RegExp('\\bis\\b');

'He is a boy.This is a dog'.replace(reg,'IS')

//"He IS a boy.This is a dog"

//添加g 全文匹配,否则匹配到第一个后停止
var reg = /\bis\b/g;
//或
var reg = new RegExp('\\bis\\b',g);
'He is a boy.This is a dog'.replace(reg,'IS')
//"He IS a boy.This IS a dog"

//IgnoreCase用法
'This Is a dog'.replace(/is/g,'Q')
//"ThQ Is a dog"
'This Is a dog'.replace(/is/gi,'Q')
//"ThQ Q a dog"


//Multiline用法
const mulStr = "@123
                                @456
                                @789"
mulStr.replace(/^@\d/g,'X');
//  "X23
//  @456
//  @789"
mulStr.replace(/^@\d/gm,'X');
//  "X23
//  X456
//  X789"

RegExp对象方法

  • compile
  • exec
  • test
  • toString
/abc/.exec("abcdef"); // "abc" 此方法返回匹配到的字符串,类似字符串的match方法
/abc/.test("abcde"); //true   此方法返回boolean值
/abc/.toString();// "/abc/"
var reg = /abc/; 
reg.compile("def"); //compile修改正则的属性
reg.test("def");//true

string类型与正则相关的方法

  • String.prototype.search 检索正则规则匹配的字符串所在的索引
  • String.prototype.replace 替换正则匹配的值
  • String.prototype.match 返回一个数组,匹配正则规则的值组成的数组
  • String.prototype.split 字符串根据正则分割
"abcabcdef".search(/(abc)/1/);//0
"aabbbbcc".replace(/b+?/,1); //aa1bbbcc
"aabbbbcc".match(/b+/);//["bbbb"]
"aabbbbccbbaa".match(/b+/g);//["bbbb","bb"]
"aabbbbccbbaa".split(/b+/);//["aa","cc","aa"]

正则可视化工具

https://regexper.com

该站点有可能会被墙,为了稳定的访问,我们也可以在github下clone,进行本地部署

https://github.com/javallone/regexper-static

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容