一、常见元字符
\b 元字符(metacharacter),单词开头或结尾,匹配一个位置。
. 元字符,匹配除了换行符以为的任意字符。
* 元字符,代表数量,可以是0,*前边的内容可以连续重复使用任意次以使整个表达式得到匹配。.*表示任意数量的不包含换行的字符。
+ 元字符,匹配重复1次或者更多次。
\d 元字符,匹配一位数字(0,1,2...)。\d{3} 匹配连续三个数字.
\s 元字符,匹配任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等。
\w 元字符,匹配字母、数字、下划线或汉字等。
^ 元字符,匹配字符串的开始。
$ 元字符,匹配字符串的结束。
二、转义字符用\,例如匹配*,就得用\*。
三、限定符:
* 重复0次或更多次
+ 重复1次或更多次
? 重复0次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
四、字符类:
[aeiou] 匹配任何一个英文元音字母
[.?!] 匹配标点符号.或?或!
[0-9] 含义与\d完全一致,匹配一位数字
五、分支条件:
用|把不同的规则分隔开。注意分支条件的顺序,匹配时将会从左到右地测试每个条件,满足,则不会测试后面的条件了。
六、分组:
匹配重复多个字符,用小括号来指定子表达式(分组),然后可以指定字表达式出现的次数。
匹配IP地址:((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)
七、反义:
查找不属于某个能简单定义的字符类的字符。比如查找数字以外的任意字符,要用到反义。
\W 匹配任意不是字母、数字、下划线或者汉字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou这几个字母以外的任意字符
八、后向引用:
使用小括号指定分组,每个分组会自动拥有一个组号,规则是:
从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。
后向引用用于重复搜索前面某个分组匹配的文本,例如,\1代表分组1匹配的文本。
\b(\w+)\b\s+\1\b可以用来匹配重复的单词,像go go, 或者kitty kitty。
这个表达式首先是一个单词,也就是单词开始处和结束处之间的多于一个的字母或数字(\b(\w+)\b),这个单词会被捕获到编号为1的分组中,然后是1个或几个空白符(\s+), 最后是分组1中捕获的内容(也就是前面匹配的那个单词)(\1)。
九、常用分组语法:
a)捕获:
(exp) 匹配exp,并捕获文本到自动命名的组里
(?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
(?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配编号
b)零宽断言:
(?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置
(?=exp)也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp。比如\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.时,它会匹配sing和danc。
(?<=exp)也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp。比如(?<=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找reading a book时,它匹配ading。
假如你想要给一个很长的数字中每三位间加一个逗号(当然是从右边加起了),你可以这样查找需要在前面和里面添加逗号的部分:((?<=\d)\d{3})+\b,用它对1234567890进行查找时结果是234567890。
下面这个例子同时使用了这两种断言:(?<=\s)\d+(?=\s)匹配以空白符间隔的数字(再次强调,不包括这些空白符)。
零宽度负预测先行断言(?!exp),断言此位置的后面不能匹配表达式exp。例如:\d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字;\b((?!abc)\w)+\b匹配不包含连续字符串abc的单词。
同理,我们可以用(?<!exp),零宽度负回顾后发断言来断言此位置的前面不能匹配表达式exp:(?<![a-z])\d{7}匹配前面不是小写字母的七位数字。
十、注释:
(?#comment) 不对正则表达式产生影响,用于注释