正则表达式是一个难以理解的概念,每次看到正则的时候都会发怵。总是学完忘了,回过头来再学,一直没有找到合适的方法。下面做一下笔记:
注:以下正则的测试均用 JavaSript
实现
普通字符
字母、数字、汉字、下划线、没有特殊定义的标点符号,都是”普通字符”。表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的一个字符。废话不多说,看代码:
var pattern1 = /a/;
var pattern2 = /bcd/;
console.log(pattern1.test('abcdef')); //true
console.log(pattern2.test('abcdef')); //true
匹配 pattern1
开始于0,结束于1;匹配 pattern2
开始于1,结束于4
特殊字符
一些不便于书写的字符,前面要加 \
进行转义 ,主要包括这些字符:
( [ { \ ^ $ | ) ? * + . ] }
比如:
表达式 | 匹配结果 |
---|---|
\ \n | \n |
\ ^ | ^ |
\ ( | ( |
\ { | { |
与 ‘多种字符’ 匹配的表达式
表达式 | 作用 |
---|---|
\d | 匹配0~9任意一个数字 |
\w | 匹配任意一个字母或数字或下划线,即A~Z,a~z.0~9,_中任意一个 |
\s | 匹配空格、制表符、换页符等空白字符中的任意一个 |
. | 即一个小数点可以匹配除\n外任意一个字符 |
如以下代码:
var pattern = /\d\w./;
console.log(pattern.test('1234abcd')); //true
匹配将开始于0,结束于4
自定义能够匹配 ‘多种字符’ 的表达式
使用 []
包含一系列字符,能够匹配其中任意一个字符;用 ^[]
则能够匹配其中字符外的任意一个字符。但都是只能匹配一个
如下:
表达式 | 作用 |
---|---|
[ab12@] | 匹配a或b或c或@ |
[^abc] | 匹配除a,b,c外的任意一个字符 |
[a-z] | 匹配a-z之间的任意一个字母 |
[^A-Z0-9] | 匹配除A-Z,0-9外的任意一个字符 |
修饰匹配次数的特殊符号
前面的正则表达式都只能匹配一次,如果加上下面的修饰符,就可以重复匹配
使用方法:修饰符放在被修饰表达式的后边
表达式 | 作用 |
---|---|
{n} | 表达式重复n次,比如: “/w{2}”相当于 “/w/w”; “[abc]{2}”相当于[abc][abc] |
{m,n} | 表达式至少重复m次,最多重复n次 |
{m,} | 表达式至少重复m次 |
? | 匹配表达式0或1次,相当于{0,1} |
+ | 匹配至少一次,相当于{1,} |
* | 匹配0次或任意次,相当于{0,} |
其它一些特殊符号
表达式 | 作用 |
---|---|
^ | 与字符串开始的地方匹配,不匹配任何字符 |
$ | 与字符串结束的地方匹配,不匹配任何字符 |
\b | 匹配一个单词边界,不匹配任何字符 |
| | 左右两边表达式或的关系,匹配左边或者右边 |
() | 在被修饰匹配次数的时候,括号中的表达式作为整体被修饰;取得匹配结果的时候,括号中的表达式匹配到的内容可以被单独得到 |
此外,大写的 “\D”, “\W”, “\S”, “\B”,对应小写相反的意义
表达式 | 作用 |
---|---|
\D | 匹配所有的非数字字符 |
\W | 匹配所有的字母、数字、下划线以外的字符 |
\S | 匹配所有非空白字符 |
\B | 匹配非单词边界,即左右两边都是 “/w” 范围或者左右两边都不是 “/w” 范围时的字符缝隙 |
后向引用
用小括号指定的表达式,会自动从左向右编号(从1,2….),然后编号可以引用。比如, \1
代表分组1的匹配:
/\b(w+)\b\s+\1/
上述将匹配像 string string
的字符串
特殊的后向引用:
语法 | 作用 |
---|---|
(exp) | 匹配exp,并自动捕获分组 |
(? |
匹配exp,并捕获文本到名称为name的组里 |
(?:exp) | 匹配exp,不捕获匹配的文本,也不分配组号 |
零宽断言
语法 | 作用 |
---|---|
(?=exp) | 匹配exp前面的位置 |
(?<=exp) | 匹配exp后面的位置 |
(?!exp) | 匹配后面跟的不是exp的位置 |
(?<!exp) | 匹配前面不是exp的位置 |
- (?=exp)
断言自身出现的位置的后面能匹配表达式 exp
,比如:
/\b\w+(?=ing\b)/
上述可以匹配以 ing
结尾的前面部分
- (?<=exp)
断言自身出现的位置的前面能匹配表达式 exp
/(?<=web)\w+\b/
上述可以匹配以 web
开头的后面部分
附: JavaScript正则表达式导图