第二章. 匹配单个字符
’ . ’ 用来匹配任意单一字符, 元字符的一种
’ \ ‘为转义字符, 属于元字符的一种, 元字符: 有特殊含义的字符
正则表达式被称为模式(pattern)
第三章. 匹配一组字符
’ [ ] ‘为元字符, 表示一个字符集合, 必须匹配其中的一个或多个字符, 也可以全部匹配. ’ [ ] ‘可以用来匹配大小写, 如[Aa].*就匹配任意以A或a或Aa开头的字符串. 还有几种常见的用法, 如[a-z] [A-Z] [0-9], 这几种很常用, 还有一个用法[A-Za-z0-9] 这个字符集可以匹配以上三种用法的合集
’ - ‘表示连字符, 是一种较为特殊的元字符, 只有在’ [ ] ’ 里才是元字符, 在其他地方就是一个普通的字符’ - ‘, 也因此在这种情况下它不需要转义
’ ^ ’ 表示排除, 也是元字符. 在上面的几种用法中, 在集合的最前面加上’ ^ ‘, 就表示匹配除了该集合以外的字符, 而且需要注意的是, ’ ^ ‘的作用域是整个字符集合, 而不是紧跟在其身后的单个字符什么的
第四章. 使用元字符
如果要匹配元字符本身, 可以用 ’ \ . 如: 匹配[ ], 用\ [ \ ]
匹配空白字符: \n换行符 \r回车符 \t制表符. 如 \r\n 就是匹配一个回车符和一个换行符, 通常被看作一段文本结束的标记
一些常用的字符合集可以用特殊元字符代替, 这一类元字符称为类元字符
数字类元字符: \d匹配任意一个数字, \D相当于\d的补集, 即匹配任意一个非数字字符
字母数字类元字符: \w 匹配任意一个字母(大小写均可)或数字, 或是一个下划线. \W 则是\w的补集, 匹配任意一个非数字字母和下划线的字符
空白字符类元字符: \s 任意一个空白字符. \S 任意一个非空白字符
第五章. 重复匹配
’ + ’ 匹配至少一个或多个字符, 如a+匹配一个或多个a, \d+匹配一个或多个数字
字符集合是可以自己创作的, 多种多样的字符集合天下无敌, 如[\w,.’:;] 就匹配\w和逗号句号分号冒号单引号
’ * ’ 匹配零个或多个字符, 用法几乎与’ + ’ 一致
’ ? ’ 匹配零个或一个字符, 用法和上面的两种基本一致
以上三个都是元字符
{ }中加上数字就表示匹配前一个字符或字符集合数次, 如 \w{6} 表示匹配\w 6次
{ }可以设置匹配次数的区间, 如{2, 4}匹配至少两次, 最多四次, {2,}表示匹配两次或多次(注意, 逗号后不要加空格)
’ + ’ , ’ * ’ , {number, }为贪婪型元字符, 与之对应的是懒惰型元字符’ *? ‘, ’ +? ‘, {number, }? 懒惰型元字符只匹配最近的一个, 并只返回一个结果. 要特别注意这两种元字符的适用情形
第六章. 位置匹配
边界: 用于指定模式前后位置(边界)的特殊元字符
第一种边界: \b ,是单词边界, 用来匹配一个单词的开头或结尾, 如: \bcat\b匹配cat这个单词 ,\bcat匹配以cat为开头的单词(并不是整个单词, 而是这个单词开头的cat, 下面的例子同理), cat\b匹配以cat为结尾的单词. 如果不想匹配单词边界(即前后没有字母), 可以用\B. 如 匹配一个前后没有单词边界的连字符(-), 用\B-\B 来匹配
另外两种边界元字符是: ’ ^ ’ ,’ $’. 分别代表字符串的开头, 字符串的末尾. 这两种是字符串边界元字符. ’ ^ ‘从字符串的最开始一行匹配.
’ $ ‘从字符串的最末尾一行匹配
(?m) 为多行模式, 其迫使正则表达式引擎将换行符视为字符串分隔符. 这样^可以真正意义上从开头开始匹配, 并匹配多行, $也是一样的道理.但是, 注意, JavaScript不支持多行模式
第七章. 使用子表达式
- 子表达式是更长的表达式的一部分, 划分子表达式的目的是为了将其视作单一的实体来使用.子表达式必须出现在( )里
- 如 匹配html里的空格’& nbsp; ‘, 用& nbsp;*不行, 因为 *匹配的是’ ; ‘. 必须这样写(& nbsp;) *才行.
- ’ | ‘表示或. 如(19|20)\d{2}表示匹配以19为开头的年份或是以20为开头的年份.
- 子表达式的嵌套, 拿IP地址举例, IP地址由四个字节构成, 所以每组数字的范围都是0-255, 所以IP地址中的每组数字都不能大于255. 每一组有以下四种情况: 1) 任意的一位数或两位数 2) 任意的以1开头的三位数 3) 任意以2开头的, 第二位数在0-4之间的三位数 4) 任意以25开头的, 第三位数在0-5之间的三位数. 若要匹配所有情况, 就必须用到子表达式的嵌套. 完整形式如下: " (((1\d{2})|(\d{1,2})|(2[0-4]\d)|(25[0-5])).){3}((1\d{2})|(\d{1,2})|(2[0-4]\d)|(25[0-5])) " 理解起来的意思无外乎以上四种情况
- 理解一个吓人的嵌套表达式(就像上面那个), 由内向外解读更佳, 更易理解
第八章. 反向引用
- 反向引用的概念太抽象不好理解, 就直接拿例子说事: [ ]+(\w+)[ ]+\1, 这里的[ ]+匹配一个或多个空格, (\w+)不解释, \1代表引用第一个子表达式, 说白了就是拿过来直接用. 还有\2, \3 分别为引用第二个子表达式………以此类推. 如: 匹配重复的两个单词 are are, 就直接用[ ]+(\w+)[ ]+\1匹配即可. (注意: 反向引用只能引用在括号里的子表达式)
- 反向引用在替换上的应用, 直接上例子: 这是一个匹配邮箱地址的模式(\w+[\w.]*@[\w.]+.\w+), 这是一个替换模式 href=$1.
- $1表示对第一个子表达式的引用, 即href= (\w+[\w.]*@[\w.]+.\w+), 这样就可以用来替换文本了. 替换文本的步骤是, 先匹配再替换
第九章. 环视
- 举一个例子来说明环视的用处. 你需要从一对标签中提取出文本内容, 直接用正则可以匹配出标签和里面的内容, 但我们需要的是文本而不是标签, 方法之一是用子表达式将正则分为三部分, 再用反向引用来进行引用. 但是这样做过于多余, 我们只想一次性匹配出文本内容, 去除掉无关内容, 这个时候就需要用到环视.
- 环视分向前看和向后看. ?=表示向前看, 如: 想匹配http://www.baidu.com里的协议, 可以这样写.+(?=:), 这样就可以匹配 ‘http’ 了. ?=:的意思是匹配到: 并从: 开始向前匹配而不匹配: 本身.
- ?<=表示向后看, 即向…..之后查看, 以此方便记忆. 使用方法和注意事项与向前看一样
- 向前看和向后看能够结合在一起使用, 同时以上两种方式称为肯定式向前看, 肯定式向后看
- 与肯定式对应的就是否定式环视. 否定式向前看: ?!, 否定式向后看: ?<! . 否定式向前看只匹配不在该字符前面的字符或字符串, 否定式向后看只匹配不在该字符后面的字符或字符串. 而至于该字符本身不进行匹配.
第十章. 嵌入式条件
正则表达式的条件要用? 来定义. 如: 字符?, ?=, ?<=等等
比较简单的条件不说. 现在说两种条件, 反向引用条件和环视条件.
反向引用条件. 例子:
123-456-8790 (123) 456-7890 (123)-456-7890 1234567890 123 456 7890要一次性匹配全部, 可以这样写 \ (?\d{3}\ )?(-?)(\s?)\d{3}?(\1)?(\2)\d{4}, 其中?(\1)和?(\2)就是反向引用条件, 即如果该子表达式存在就引用, 否则不进行引用. 其实就相当与if条件判断. 所以, 还有一种else条件句. (? (backreference) true|false)(不知道为什么总是出错)
环视条件. 例子:
11111 22222 33333- 44444-4444匹配除了33333-的全部, 可以这样写: \d{5}(?(?=-)-\d{4}). 在(?(?=-)-\d{4})这一部分中, 先对?=-进行匹配, 如果匹配到了-, 就执行后面的模式.
匹配中文:[\u4e00-\u9fa5]