在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。 正则表达式就是用于描述这些规则的工具。
\b是正则表达式规定的一个特殊代码(好吧,某些人叫它 元字符,metacharacter),代表着单词的开头或结尾,也就是单词的分界处(\bhi\b) 。虽然通常英文的单词是由空格,标点符号或者换行来分隔的,但是\b并不匹配这些单词分隔字符中的任何一个,它只匹配一个位置(假如你要找的是hi后面不远处跟着一个Lucy,你应该用\bhi\b.*\bLucy\b)。
^(和数字6在同一个键位上的符号)和$都匹配一个位置,这和\b有点类似。 ^匹配你要用来查找的字符串的开头,$匹配结尾。和忽略大小写的选项类似,有些正则表达式处理工具还有一个处理多行的选项。如果选中了这个选项,^和$的意义就变成了匹配行的开始处和结束处。
.是另一个元字符,匹配除了换行符(‘\n’)以外的任意字符。
*同样是元字符,代表数量——它指定*前边的内容可以连续重复出现任意次以使整个表达式得到匹配。(重复0次到n次)
+是和*类似的元字符,不同的是 *匹配重复任意次(可能是0次),而+则匹配重复1次或更多次(重复1次到n次)。
? 重复0次或1次
{n}重复n次
{n,} 重复n次或更多次
{n,m}重复n次到m次
\W 匹配任意不是字母,数字,下划线,汉字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou这几个字母以外的任意字符(<a[^>]+>匹配用尖括号括起来的以a开头的字符串。)
\d,匹配一个数字。在使用过程中为了避免重复,可以\d{2}表示:\d 必须连续重复匹配2次(8次)。\d{5,12} 则是重复的次数不能少于5次,不能多于12次,否则都不匹配。
\s匹配任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等 。
\w匹配字母或数字或下划线或汉字
\ 取消这些元字符的特殊意义eg:\.、\\
[] 匹配没有预定义元字符的字符集合,eg:[aeiou]就匹配任何一个英文元音字母 ,[.?!] 匹配标点符号(.或?或!) ,[0-9]代表的含意与\d就是完全一致的:一位数字;同理[a-z0-9A-Z_]也完全等同于\w
| 分枝条件,将不同的规则分隔开。匹配分枝条件时,将会从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了。\d{5}-\d{4}|\d{5}与\d{5}|\d{5}-\d{4}不同,\d{5}|\d{5}-\d{4}只会匹配5位的邮编(以及9位邮编的前5位)。
()小括号来指定子表达式(也叫做分组),IP地址(IP地址中每个数字都不能大于255)的正则表达式:((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)
后向引用用于重复搜索前面某个分组匹配的文本。从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。\b(\w+)\b\s+\1\b可以用来匹配重复的单词,\1代表分组1匹配的文本,像go go, 或者kitty kitty。要指定一个子表达式的组名,请使用这样的语法:(?<Word>\w+)(或者把尖括号换成'也行:(?'Word'\w+)),这样就把\w+的组名指定为Word了。要反向引用这个分组捕获的内容,你可以使用\k<Word>,所以上一个例子也可以写成这样:\b(?<Word>\w+)\b\s+\k<Word>\b 。
(exp) 匹配exp,并捕获文本到自动命名的组里
(?<name>exp)匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
(?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号
(?=exp) 匹配exp前面的位置,\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分)
(?<=exp) 匹配exp后面的位置,(?<=\bre)\w+\b,会匹配以re开头的单词的后半部分(除了re以外的部分)
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置
(?#comment)这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读
贪婪匹配:当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。
懒惰匹配:匹配尽可能少的字符,在重复匹配符(*,+等)后加个?。.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。Eg:*?重复任意次,但尽可能少重复;+?重复1次或更多次,但尽可能少重复;??重复0次或1次,但尽可能少重复;{n,m}?重复n到m次,但尽可能少重复;{n,}?重复n次以上,但尽可能少重复.