正则表达式是一个难以理解的概念,每次看到正则的时候都会发怵。总是学完忘了,回过头来再学,一直没有找到合适的方法。下面做一下笔记:
注:以下正则的测试均用 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正则表达式导图
