正则表达式

2015/9/18 posted in  理论概念  

元字符

  • '.' 匹配除换行符以外的任意字符
  • '\w' 匹配字母、数字、下划线、汉字
  • '\W' 匹配任意不是字母,数字,下划线,汉字的字符
  • '\s' 匹配任意的空白符,包括空格、制表符(Tab)、换行符
  • '\S' 匹配任意不是空白符的字符
  • '\d' 匹配一个数字
  • '\D' 匹配任意非数字的字符
  • '\b' 匹配单词的开始或结束
  • '\B' 匹配不是单词开头或结束的位置
  • [abcde] 匹配 'abcde' 中任意一个字符
  • [aeiou] 匹配除 ’aeiou‘ 以外的任意字符
  • '' 匹配行首
  • '$' 匹配行尾
  • '\A' 匹配字符串开头
  • '\z' 匹配字符串结尾
  • '\Z' 匹配字符串结尾,如果字符串已 '\n' 结尾,不匹配最后的 '\n'

限定符

  • '*' 重复零次或更多次
  • '+' 重复一次或更多次
  • '?' 重复零次或一次
  • '{n}' 重复n次
  • '{n,}' 重复n次或更多次
  • '{n,m}' 重复n到m次

复杂规则

  • 子表达式
    详见下面 '###子表达式'

  • 字符转义
    使用 '\' 来取消元字符的特殊意义,用于匹配元字符本身。
    例如:foobar\.com 匹配 'foobar.com'

  • 分支条件
    使用 '|' 指定几种规则,匹配其中任意一种
    例如:/foo|bar/ 匹配 'foo' 或 /foo|bar/ 匹配 'bar'

  • 贪婪和懒惰
    通常正则表达式在使得整个表达式能得到匹配的前提下尽可能多的匹配字符,这被称为贪婪匹配。
    有时我们需要尽可能少的匹配字符,可以在限定符后面加上一个 '?',转换为懒惰匹配模式。
    例如:'a.*b' 匹配 'aabab',而 'a.*?b' 匹配 'aab'

子表达式

使用 '()' 建立子表达式(也叫分组),然后可对子表达式进行一些操作。

  • 重复多个字符
    例如:(\d{1,3}\.){3}\d{1,3} 匹配 '4.55.666.7'

  • 向后引用,用于重复搜索前面某个分组匹配的文本
    例如:'/(\w+),(\1.*)/' 匹配 'foobar,foobar2'

  • 捕获匹配内容
    匹配子表达式的文本(也就是分组捕获的内容)可以在表达式或其它程序中作进一步的处理。

  • 默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。分组 0 对应整个正则表达式匹配的内容。

  • 也可以自己指定子表达式的组名,语法为:'(?reg)' 或 "(?'GroupName'reg)"。

  • 不捕获匹配的文本,也不给分组分配组号,语法为 '(?:reg)'。

  • 零宽断言
    用于查找在某些内容(但并不包括这些内容)之前或之后的东西。

  • '(?=exp)' 前置断言,断言自身出现的位置的后面能匹配表达式 exp。
    例如:'\w+(?=bar)' 匹配以 bar 结尾的字符串,捕获内容不包含 bar。 'foobar' 捕获的内容为 'foo'

  • '(?<=exp)' 后置断言,断言自身出现的位置的前面能匹配表达式 exp。
    例如:'(?<=foo)\w+' 匹配以 foo 开头的字符串,捕获内容不包含 'foo'。'foobar' 捕获的内容为 'bar'

  • '(?!exp)' 前置非断言,断言此位置的前面不能匹配表达式 exp。
    例如:'/\b(?!foo)\w+\b/' 不匹配以 'foo' 开头的单词

  • (?<!exp) 后置非断言,断言此位置的后面不能匹配表达式 exp
    例如:/\b\w+(?<!bar)\b/ 不匹配以 'bar' 结尾的单词