JavaScript正则表达式

148 阅读3分钟

正则表达式

1. 正则表达式字符匹配攻略

1.1 两种模糊匹配

  • 横向模糊匹配
const reg = /ab{1,3}c/g;    //第一个查找a,第二个查找1到3个b,第三个查找c。     全局查找
const str = "abc abbc abbbc abbbbc abbbbbc abbbbbbc";
console.log(str.match(reg));     
// abc abbc abbbc 
  • 纵向模糊匹配
const reg = /a[123]c/g;    //第一个查找a,第二个查找1或2或3,第三个查找c。     全局查找
const str = "a1c a2c a3c a4c a5c";
console.log(str.match(reg));     
// a1c a2c a3c 

1.2 字符组

虽然叫字符组,但只是其中的一个字符。
例如[abc],表示匹配一个字符,可以是a或b或c。
如果想查找全部大写字母,可以使用[A-Z]

如果是排除某个字符,则可以使用[^abc]。表示排除a,b,c三个字符。

当然也有一些简写显示

简写含义
\d表示[0-9]。表示一位数字
\D表示[^0-9]。表示除数字外任意字符
\w表示 [0-9a-zA-Z_]。表示数字、大小写字母和下划线。
\W表示 [^0-9a-zA-Z_]。非单词字符。
\s表示 [ \t\v\n\r\f]。表示空白符,包括空格、水平制表符、垂直制表符、换行符、回车符、换页符。
\S表示 [^ \t\v\n\r\f]。 非空白符。
.所有字符

1.3 量词

{m,n}表示前面的字符或字符组出现m或n次。
简写形式

简写含义
*等价于{0,},表示前面的字符或字符组出现0次或多次。
+等价于{1,},表示前面的字符或字符组出现1次或多次。
?等价于{0,1}表,示前面的字符或字符组出现0次或1次。
{m}表示前面的字符或字符组出现m次。
{m,}表示前面的字符或字符组出现m次或多次。

例如:RegExp: /a{1,2}b{3,}c{4}d?e+f*/
表示:a字符出现1次或2次,b字符出现3次或多次,c字符出现4次,d字符出现0次或1次,e字符出现1次或多次,f字符出现0次或多次。

贪婪匹配与惰性匹配

  • 贪婪匹配:尽可能多的匹配
  • 惰性匹配:尽可能少的匹配

默认情况下是贪婪匹配,在量词后面加个?就能实现惰性匹配。

1.4 多选分支

|表示多选分支,多选分支中的内容,只要匹配一个就可以。
例如:RegExp: /abc|def|ghi/
表示:匹配abc、def或ghi中的任意一个。
多选分支是惰性的,前面的匹配到了,后面的就不再尝试了。

2. 正则表达式位置匹配攻略

位置的概念:相邻字符之间的位置,包括行头和行尾。位置可以理解为空字符""

^(脱字符)匹配开头,在多行匹配中匹配行开头。 $(美元符号)匹配结尾,在多行匹配中匹配行结尾。

例子:

const reg = /^|$/g;    
const str = "abc a123 a!";
console.log(str.replace(reg,'#'));  
//  #abc a123 a!#

多行匹配模式m

const reg = /^|$/gm;    
const str = "abc\n a123 a!";
console.log(str.replace(reg,'#'));  
//  #abc#
//  #a123 a!#

\b是单词边界,具体就是\w\W之间的位置。通俗来说就是字符或数字与非字符或数字之间的位置。

\B就是\b的反义词,非单词边界。

const reg = /\b/g;    
const reg1 = /\B/g;
const str = "abc a123 a!";
console.log(str.replace(reg,'#'));  
//  #abc# #a123# #a#!

console.log(str.replace(reg1,'#')); 
//  a#b#c a#1#2#3 a!#     
  • (?=p)是正向先行断言,具体就是p前面的位置。

  • (?!p)是负向后发断言,是正向先行断言的方面意思。

var result = "hello".replace(/(?=l)/g, '#');
console.log(result);
// => "he#l#lo"

var result1 = "hello".replace(/(?!l)/g, '#');
console.log(result1);
// => "#h#ell#o#"

案例:数字的千分位分隔符表示法

const reg = /(?!^)(?=(\d{3})+$)/g;    
const str = "1234567890";    
console.log(str.replace(reg,','));  
//  1,234,567,890

解释:^表示匹配开头,(?!^)排除开头的位置,(\d{3})表示匹配三个数字,?=(\d{3})表示匹配三个数字前面的位置,+表示匹配三个数字前面的位置1次或多次,$表示匹配结尾,

3. 正则表达式括号的作用

括号的作用:分组,记忆,截取。

  • 分组
  • 分支结构

替换
想把日期的yyyy-mm-dd格式替换成mm/dd/yyyy格式,

const reg = /(\d{4})-(\d{2})-(\d{2})/g;    
const str = "2020-01-01";    
console.log(str.match(reg));  
//  ["2020-01-01", "2020", "01", "01"]
console.log(str.replace(reg, '$2/$3/$1'));  
//  01/01/2020

replace中的第二个参数里用11、2、$3表示分组捕获的内容。

反向引用
\1表示第一个分组捕获的内容,\2表示第二个分组捕获的内容。
如果遇到嵌套的括号,则从外内里分组,从左到右分组。

如果引用了不存在的分组,不会报错,只是匹配反向引用字符本身。