码迷,mamicode.com
首页 > 其他好文 > 详细

常见的正则表达式

时间:2016-07-28 16:20:42      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:

在开始之前先说一些值得大家注意的事项吧

1 正则表达式没有逻辑与、逻辑非关系。那么要实现逻辑与,就要靠表达式序列来实现了,也就是组合。而逻辑非要靠零宽断言来实现了,但是不幸的是,现在大多数工具对断言啊,分组捕获的支持并不完整。比如sed,是不支持断言的。

2 正则表达式的逻辑或关系,在正则表达式中是靠多选来实现的。

3 请谨遵语法,对于那些用惯了一个*来代表若干字符的,请注意,这并不是标准的正则表达式,而是一些工具自己内部封装的特殊符号。

4 注意匹配的范围,正则表达式默认是匹配最大范围,就是说大家要考虑匹配句子?匹配单词?匹配单词的一部分?比如有以下的文本行,int main(int argc... ,对于表达式.*t\b将匹配以下内容 int main(int,而如果你用\w*t\b,将只匹配2个int,更严谨的表达方式是\b\w*t\b。所以建议大家尽可能使用代表小范围的通配符(元字符)。

5 至于贪婪和懒惰啊,递归啊,这些在某些语言中有支持,但是这个因为语言差异太大,本文不作详述。

一些符号注意事项

1 连字符 这个只在字符组内有特殊意义,在字符组外代表自己本身。

2 占位元字符在字符组内代表字符本身,不具有通配符的指代特征,但是位置元字符在字符组内是通配符。

正则表达式是记录文本规则的代码,主要的作用就是用于匹配文本。

语法:[内容][次数]

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} 也可以匹配 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} 匹配前面不是小写字母的七位数字

 

 

技术分享

技术分享

 

创悦(深圳)投资管理有限公司

为成长喝彩

微信:CreajoyYOJOY

微博:http://weibo.com/CreajoyYOJOY

官网:http://www.creajoyvc.com/

常见的正则表达式

标签:

原文地址:http://www.cnblogs.com/Creajoy/p/5714862.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!