- 匹配字符
- 横向(长度)
- 纵向(类型)
- 是
- 不是[^ ]
- 匹配位置
- 头
- 尾
- 模式头
- 非模式头
- 模式尾巴
- 非模式尾
- 单词
- 非单词
JavaScript RegExp 对象有3个方法:test()、exec()、compile()
- test():检测一个字符串是否匹配某个正则表达式,如果匹配成功,返回true,否则返回false;
-
var r = /\d{3}/; var a = '123'; r.test(a) //true
- exec():检索字符串中与正则表达式匹配的值,返回一个数组,存放匹配的结果;如果未找到,返回null;
-
var str = "Here is a Phone Number 111-2313 and 133-2311" ; var reg = /(\d{3})[-.]\d{4}/g; var result = reg.exec(str);
str的方法
- replace
-
var s = "Hello,My name is Vincent." var result = s.replace(/([aeiou])/g,"$1$1") //"Heelloo,My naamee iis Viinceent."
- match(reg):返回可以匹配序列(类似exec)
-
var reg = /w+/ var s = "compus, I know something about you" s.match(reg) //["compus"]
- split(reg):分开为数组
-
var s = "unicorns and rainbows And, Cupcakes" result = s.split(/[,\s]/); //["unicorns", "and", "rainbows", "And", "", "Cupcakes"]
正则表达式是匹配模式,要么匹配字符,要么匹配位置.各种方式结合,取交集
匹配区间 | 正则表达式 | 记忆方式 |
---|---|---|
除了换行符之外的任何字符 | . | 句号,除了句子结束符 |
单个数字, [0-9] | \d | digit |
除了[0-9] | \D | not digit |
包括下划线在内的单个字符,[A-Za-z0-9_] | \w | word |
非单字字符 | \W | not word |
匹配空白字符,包括空格、制表符、换页符和换行符 | \s | space |
匹配非空白字符 | \S | not space |
多行模式 | m标志 | multiple of lines |
忽略大小写 | i标志 | ignore case, case-insensitive |
全局模式 | g标志 | global |
多行模式可以匹配多个^$
1、匹配位置
^
脱字符,匹配行的开头
let string = 'hello'
console.log(string.replace(/^/, '😄')) // 😄hello
$
美元符号,匹配行的结尾
let string = 'hello'
console.log(string.replace(/$/, '😄')) // hello😄
\b
单词的边界,具体讲有三点规则。
① \w和\W之间的位置
② ^与\w之间的位置
③ \w与$之间的位置
'xxx_love_study_1.mp4'.replace(/\b/g, '❤️') // ❤️xxx_love_study_1❤️.❤️mp4❤️
\B
非单词的边界,也就是\b反着来的意思,它的规则如下:
① \w与\w之间的位置
② \W与\W之间的位置
③^与\W之间的位置
④\W与$之间的位置
'[[xxx_love_study_1.mp4]]'.replace(/\B/g, '❤️')//
❤️[❤️[x❤️x❤️x❤️_❤️l❤️o❤️v❤️e❤️_❤️s❤️t❤️u❤️d❤️y❤️_❤️1.m❤️p❤️4]❤️]❤️
(?=p)
符合p子模式前面的那个位置。换句话说是,有一个位置,紧跟其后需要满足p子模式。也有一个学名叫正向先行断言。
'xxx_love_study_1.mp4'.replace(/(?=xxx)/g, '❤️') // ❤️xxx_love_study_1.mp4
(?<=p)
符合p子模式后面(注意(?=p)表示的是前面)的那个位置。换句话说是,有一个位置,其前面的部分需要满足p子模式。
'xxx_love_study_1.mp4'.replace(/(?<=xxx)/g, '❤️') //xxx❤️_love_study_1.mp4
(?!p)
(?=p)反过来的意思,可以理解为(?=p)匹配到的位置之外的位置都是属于(?!p)的,它也有一个学名叫负向先行断言。
'xxx_love_study_1.mp4'.replace(/(?!xxx)/g, '❤️')
// (?=xxx)的输出
❤️xxx_love_study_1.mp4
// (?!xxx)的输出
x❤️x❤️x❤️_❤️l❤️o❤️v❤️e❤️_❤️s❤️t❤️u❤️d❤️y❤️_❤️1❤️.❤️m❤️p❤️4❤️
(?<!p)
(?<=p)反过来的意思,可以理解为(?<=p)匹配到的位置之外的位置都是属于(?<!p)的,
'xxx_love_study_1.mp4'.replace(/(?<!xxx)/g, '❤️')
// (?<=xxx)的输出
xxx❤️_love_study_1.mp4
// (?<!xxx)的输出
❤️x❤️x❤️x_❤️l❤️o❤️v❤️e❤️_❤️s❤️t❤️u❤️d❤️y❤️_❤️1❤️.❤️m❤️p❤️4❤️
2、匹配字符
两种模糊匹配
横向
一个正则可匹配的字符串的长度不是固定的,可以是多种情况,通过量词+、*、?、{m,n},可实现横向匹配
*
:匹配任意次
+
:最低匹配1次
?
:匹配1次或者0次
{m}
:匹配m次
{m,}
:最低匹配m次
{m,n}
:最低匹配m次,最多匹配n次,m需要小于等于n
纵向(是或不是)
一个正则匹配的字符串,具体到某一位字符时,可以不是某个确定的字符串,可以有多种可能,实现方式是字符组( 其实多选分支|也可以实现 )
字符组
范围表示法
[123456abcdefABCDEF] => [1-6a-fA-F]
复制代码
排除字符组
某位字符可以是任何东西,但是就是不能是xxx, 使用^符号
问题:如何要表示除了某个单词之外的任意东西呢?(在中括号中)
[^abc]
复制代码
常见简写形式
\d // 数字
\D // 非数字
\w // [0-9a-zA-Z_]
\W // [^0-9a-zA-Z_]
\s // [\t\v\n\r\f]
\S // [^\t\v\n\r\f]
.
复制代码
量词
量词 & 简写
1. {m,} // 至少出现m次
2. {m} // 出现m次
3. ? // 出现0次或者1次,等价于{0,1}
4. + // 至少出现1次,等价于{1,}
5. * // 出现人一次,等价于{0,}
贪婪匹配 VS 惰性匹配
正则本身是贪婪的,会尽可能的多匹配符合模式的字符
量词后面加一个?,即变成了惰性匹配
let regex = /\d{2,5}/g
let string = '123 1234 12345 123456'
// 贪婪匹配
// string.match(regex) // [ 123, 1234, 12345, 12345 ]
// 惰性匹配
let regex2 = /\d{2,5}?/g
// string.match(regex) // [ 12, 12, 34, 12, 34, 12, 34, 56 ]
多选分支
一个模式可以实现横向和纵向的模糊匹配,而多选分支可以支持多个子模式任选其一,形式是(p1|p2|p3)
常用表达
.+ | 任意字符出现 |
?=.*\d | 任意字数符号之后是数字 |
一般要加开头结尾^&