0%

Regular

横向匹配,匹配的长度是不固定的

1
2
 abbc abbbc
/ab{2,5}c/

纵向匹配,具体到某一字符,也有多种可能

1
2
3
ab1c ab2c
/ab[1,2,3]c/

字符组

范围表示法

1
[1234][1 - 4];

排除字符组

[^ab] 除 ab 以外的任意字符

常见简写形式

\d [0-9] 数字
\D [^0-9] 除数字以外的字符
\w [a-z0-9A-Z_] 数字、大小写字母、下划线
\W 非单词字符
\s 空格
\S 非空格
. 任意字符

量词

{m,} 至少出现 m
{m} 出现 m
? {0,1} 出现或者不出现

  • {1,} 出现至少一次,加好追加,先得有一次
  • {0,} 出现一次或者任意次

贪婪匹配与惰性匹配

\d{2,5} 数字 2-5
123 12345 123

\d{2,5}? 虽然 2,5 但是有一次就行了
12, 34, 56

惰性匹配只需要给后面加个?

多选分支

a|b|c

abc

good|at 如果匹配 goodat 会匹配到 good,可见也是惰性的,匹配一次,后面就不再匹配

匹配颜色
#af0
#000000
/#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})/g

匹配时间
23:21
05:59
7:9
/^([01][09]|[2][0-3]):[0-5][0-9]/

/^(0?[0-9]|1[0-9]|[2][0-3]):(0?[0-9]|[0-5][0-9])/

匹配日期
1995-03-29

/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/g

window 操作路径
F:\study\javascript\regex\regular expression.pdf
F:\study\javascript\regex
F:\study\javascript
F:\

代表不能为空的文件名 _出现 0 或者任意次{0,} ?可有可无{0,1}
/^[a-zA-F]:\([^\:
<>|”?\r\n]+\)([^\:<>|”?\r\n]+)?$/

匹配id

/id=”.*?”/

/id=”(.?)”/
id=”[^”]

正则表达式匹配 匹配位置和匹配字符

/^|$/g

(?=p) (?!p)

(?=p) 表示p前面的位置
“hello”.replace(/(?=l)/g,”#”)

“he#l#lo”

(?!p)

(?!p) 表示非p前面的位置
“hello”.replace(/(?!p)/g,”#”)
#h#ell#o

位置的特性

1
2
"hello" = "" + "" + "hello"
"hello" /^^hello$$$/

千分位

12,345,678

/(?!^)(?=(\d{3})+$)/g

12345678 1234556 12,345,678 123,345

/(?!\b)(?=(\d{3})+\b)/g
\b 表示单词和空格之间的距离
不是\b前的位置 (?!\b) \B
/\B(?=(\d{3})+\b)/g

格式化

1800 $ 1,800.00

1
2
3
4
5
const format = (num) =>{
return num.toFixed(2).replace(/\B(?=(\d{3})+\b)/g,',').replace(/^/,'$$ ')
}


密码

/(?=.*[0-9])^[a-zA-Z0-9]{6,12}$/ 是否包含数字0-9

/(?=.[0-9])(?=.[a-z])^[a-zA-Z0-9]{6,12}$/ 包含两种

/(?=.*[0-9])^/
表示开头前还有个位置,有任意多个字符,且有数字,简言之字符包含数字

?!p 不包含数字 不包含小写字母 也就是不能单独的存在
/(?!^[0-9]{6,12}$)(?!^[a-z]{6,12}$)^[a-zA-Z0-9]{6,12}$/

正则括号的作用

分组

(ab)+

分支结构匹配的所有可能性

(a|b|c)

分组引用

用括号包裹表示【存储到的分组数据】
/(\d{3})-(\d{2})/

【提取数据】
string.match(reg)

reg.exec(string)

$1-$9
RegExp.$1 构造函数的全局属性

替换

‘2021-03-29’.replace(/(\d{3})-(\d{2})-(\d{2})/,$2/$3/$1)
03/29/2021

反向引用

2017-06-12”
2017/06/12”
2017.06.12”
2016-06/12”
/\d{4}(-|/|.)\d{2}\1{d}2/

\1 表示前面(-|/|.)匹配到的字符,表示前后两者一致

分组后面有量词会匹配最后一次结果

12345
(\d)+ 5

非捕获括号

(?:p)

1
2
3
let str = 'I love js java node'
let str = 'I love node'
reg = /^ I love (?:js|node)/

trim 实现

1
2
3
一个是替换 另一个是提取
/^\s+|\s+$/g ''
/^\s*(.*?)\s*$/g $1

每个单词的首页字母大写

1
/(?:^|\s)\w/g $1.toUpperCase 

驼峰

1
2
3
-moz-magic
/[_-\s]+(.)?/g
(.) 首字母 ?字符尾巴可能不是单词字符 '-moz-magic '

逆驼峰化

MozTransform
-moz-transform

1
2
/([a-zA-Z])/g, '-$1' 
/[_-\s]+/g, '-'

转义

1
2
&lt;&gt;div&lt;
/\&([^;]+);/g.replace(match,key) &gt gt

匹配成对标签

regular expression /\<([^>]+)>/ /\<\/[^>]+>/ var regex = /<([^>]+)>[\d\D]*<\/\1>/; \d\D 数字或者不是数字 任意字符

回溯

// 贪婪12345 \d{1,3} 123 \d{1,3} 45

/“.“/ /“[^”]“/减少回溯

// 惰性 ? 尽可能少

// 分支 a|b|c

/^((0{0,2}\d|0?\d{2}|1\d{2}|2[0-4]\d|25[0-5]).){3}(0{0,2}\d|0?\d{2}|1\d{2}|2[0-4]\d|25[0-5])$/

// 简化
((…).){3} 三位数.三位数.

(0{0,2}\d|0?\d{2}|1\d{2}|2[0-4]\d|25[0-5])

0{0,2}\d 匹配一位数,包括补齐0。 9 09 009 分别0、1 、2三次

0?\d{2} 匹配两位数,包括补齐0。00-99 000-099

1\d{2} 100-199

2[0-4]\d 200-249

25[0-5] 250-255

// 提取公共部分
/this|that/ /th(?is|at)/

// 减少分支数量
/red|read/ /rea?d/

var regex = /^(\d{4})\D(\d{2})\D(\d{2})$/;
var string = “2017-06-26”;
console.log( string.match(regex) );
// =>[“2017-06-26”, “2017”, “06”, “26”, index: 0, input: “2017-06-26”]