Blog A Paranoid Guy

正则表达式笔记

2016-05-16

正则表达式是一个难以理解的概念,每次看到正则的时候都会发怵。总是学完忘了,回过头来再学,一直没有找到合适的方法。下面做一下笔记:

注:以下正则的测试均用 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) 匹配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正则表达式导图


下一篇 常用正则

Comments