区别于常见的正则表达式教程,本教程让你快速入门,并规避常见问题。正则表达式
(你们能够阅读完后边的教程再阅读注意事项,注意事项放在前边只是为了引发注意)数组
在开始以前先说一些值得你们注意的事项吧工具
1 正则表达式没有逻辑与、逻辑非关系。那么要实现逻辑与,就要靠表达式序列来实现了,也就是组合。而逻辑非要靠零宽断言来实现了,可是不幸的是,如今大多数工具对断言啊,分组捕获啊,的支持并不完整。好比sed,是不支持断言的。教程
2 正则表达式的逻辑或关系,在正则表达式中是靠多选来实现的。递归
3 请谨遵语法,对于那些用惯了一个*来表明若干字符的,请注意,这并非标准的正则表达式,而是一些工具本身内部封装的特殊符号。字符串
4 注意匹配的范围,正则表达式默认是匹配最大范围,就是说你们要考虑匹配句子?匹配单词?匹配单词的一部分?好比有如下的文本行,int main(int argc... ,对于表达式.*t\b将匹配如下内容 int main(int,而若是你用\w*t\b,将只匹配2个int,更严谨的表达方式是\b\w*t\b。因此建议你们尽量使用表明小范围的通配符(元字符)。it
5 至于贪婪和懒惰啊,递归啊,这些在某些语言中有支持,可是这个由于语言差别太大,本文不做详述。io
一些符号注意事项入门
1 - 连字符,这个只在字符组内有特殊意义,在字符组外表明字符自己。sed
2 ^ 脱字符,在字符组内的最前位置时表示排除的意思,在字符组内的其它位置表示字符自己,在字符组外则是通配符,表示行首。
3 . $ * + ? { } ( ) | ,在字符组内表示字符自己,在字符组外则是通配符或做用符。
4 字符组内,[ 和 ] 须要转义
5 分组内,( 和 ) 须要转义
正则表达式是记录文本规则的代码,主要的做用就是用于匹配文本。
语法:[内容][次数]
1 咱们把一个内容和次数组成的块叫小节,那正则表达式就是由若干个小节构成的。
2 内容后若是不加次数表明内容出现一次。
3 特定内容(位置元字符)后不该该跟次数。好比 ^ 和 $ 。
内容能够是普通字符、元字符、逻辑表达式和引用。
元字符表
. 匹配除换行符之外的任意字符 \w 匹配字母或数字或下划线或汉字 \s 匹配任意的空白符 \d 匹配数字 \b 匹配单词的开始或结束 ^ 匹配字符串的开始 $ 匹配字符串的结束 \W 匹配任意不是字母,数字,下划线,汉字的字符 \S 匹配任意不是空白符的字符 \D 匹配任意非数字的字符 \B 匹配不是单词开头或结束的位置
注意:其中\b、^、$、\B不表明任何字符位,他们表明一个位置,咱们称他们为位置元字符,其它元字符称为占位元字符。
次数表
* 重复零次或更屡次 + 重复一次或更屡次 ? 重复零次或一次 {n} 重复n次 {n,} 复n次或更屡次 {n,m} 重复n到m次
例:
\d{5} 能够匹配 99999 \w*ing 能够匹配 doing \w+ing 能够匹配 doing \w{2}ing 也能够匹配 doing
逻辑表达式
咱们把逻辑表达式划分为组合、字符组、分组、多选。
组合
像 \w*ing 是由4个小节构成的,分别是\w*、i、n、g。
字符组
[]中括号扩起来的若干字符表示一个字符组,字符组内的字符是"或"的关系。
字符组内可以使用连字符-。
注意:字符组后边的次数,通常用 + 而不用 *,由于字符组后用 * 会匹配到出现0次的状况,这种状况会匹配到 \b 。
好比你想用字符组匹配2个单词 int 或 argc,[(int)(argc)] 是错误的,这个表明2个分组,而分组内又是组合。集合内不能识别分组,将小括号识别为普通字符。
看来结果将不符合你的预期,这种逻辑建议使用或来表述 \bint\b|\bargc\b。
例:
[int] 分别匹配字符i、n、t [0-9] 分别匹配0到9 \b[int]+\b 能够匹配到单词int、in、it
排除字符组
^ 表示排除
注意:若是你想在字符组内使用排除法去匹配一个单词(见下面的例子),建议你在集合内加上 \W (大写),不然空格和一些特殊字符也会被匹配到。
例:
[^x] 匹配除了x之外的任意字符。 [^aeiou] 匹配除了aeiou这几个字母之外的任意字符 \b[^int\W]\b 匹配不出现字符i、n、t的单词,若是不加 \W ,空格和一些特殊字符就不被排除
分组
()用小括号括起来的子表达式
例:
(\d{1,3}\.){3} 匹配999.999.999.
多选
| 表示"或"
注意:或的优先级低于其它任何逻辑表达式。可以使用分组来提升或的优先级。
例:
\bint|argc\b 除了能够匹配到 int 或 argc,还能够匹配到 inta 或 hargc内的部分字符 \b(int|argc)\b 只匹配单词 int 或 argc
转义字符
\使用斜杠来显现转义字符。
全部的元字符、次数符、逻辑符号都须要转义。
需转义的字符有
\ . ^ $ * + ? { } [ ] ( ) |
后向引用
引用容许在后边的表达式中引用前边捕获到的分组的文本。
分组被捕获,而后用\斜杠加数字引用捕获到的内容。
命名捕获在不一样的语言中有不一样的表示方法(Paython中使用(?P<name>group),.NET framework 中使用(?<name>group)),在这里不详述。
例:
\b(\w+)\b\s+\1\b 捕获像 go go, 或者kitty kitty 这样的叠词
零宽断言
断言是一种判断,就是判断是否符合断言表达式,符合时才匹配其它内容,不符合就不匹配。
注意:断言的内容不被匹配,这也是为何它们被称为零宽的缘由。
零宽断言不能单独存在,必须与非零宽的表达式组合。
不是全部的工具都支持全部的零宽断言。
断言表达式
(?=exp) 匹配exp前面的位置 (?<=exp) 匹配exp后面的位置 (?!exp) 匹配后面跟的不是exp的位置 (?<!exp) 匹配前面不是exp的位置
断言分为正向断言和负向断言,上表前2个表达式是正向断言,后2个表达式是负向断言。
例:
\b\w+(?=ing\b) 匹配以ing结尾的单词 (?<=\bre)\w+\b 匹配以re开头的单词 \b((?!abc)\w)+\b 匹配不包含连续字符串abc的单词 (?<![a-z])\d{7} 匹配前面不是小写字母的七位数字