没画完的画

喂马 劈柴 BBQ~
posts - 37, comments - 55, trackbacks - 0, articles - 0
  C++博客 ::  :: 新随笔 :: 联系 :: 聚合  :: 管理

正则表达式

Posted on 2008-09-27 10:44 没画完的画 阅读(134) 评论(0)  编辑 收藏 引用

1.概念:
   一个正则表达式,就是用某种模式去匹配一类字符串的一个公式。
   
2.Perl兼容正则表达式
必须记住的几个符号和组合
.           匹配除换行符以外的所有字符一次
?           匹配 0 次或一次
*           匹配 0 次或多次
+           匹配 1 次或多次

使用范例:
x?      匹配 0 次或一次 x 字符串
x*      匹配 0 次或多次 x 字符串,但匹配可能的最少次数,*必须跟随一个字符后面,不能单独出现
x+      匹配 1 次或多次 x 字符串,但匹配可能的最少次数,+必须跟随一个字符后面,不能单独出现
.*      匹配 0 次或一次的任何字符
.+      匹配 1 次或多次的任何字符

界定范围和位置
^           匹配字符开头的字符
$           匹配字符结尾的字符
{m}           匹配刚好是 m 个 的指定字符串
{m,n}         匹配在 m个 以上 n个 以下 的指定字符串
{m,}          匹配 m个 以上 的指定字符串
[]            匹配符合 [] 内的字符
[^]          匹配不符合 [] 内的字符
[0-9]         匹配所有数字字符
[a-z]         匹配所有小写字母字符
[^0-9]        匹配所有非数字字符
[^a-z]        匹配所有非小写字母字符
  
\b           不属于空白字符,向前缩进一个字符
\d           匹配一个数字的字符,和 [0-9] 语法一样
\w          英文字母或数字的字符,和 [a-zA-Z0-9]+ 语法一样
\s           空格,和 [\n\t\r\f] 语法一样
\B           匹配不以英文字母,数值为边界的字符串
\D           非数字,其他同 \d
\S           非空格,和 [^\n\t\r\f] 语法一样
\W          非英文字母或数字的字符串,和 [^a-zA-Z0-9] 语法一样

a|b|c        匹配符合a字符 或是b字符 或是c字符 的字符串
abc          匹配含有 abc 的字符串
转义:       使用\ 来取消元字符的特殊意义。包括 . * + \  [ ] { } ( ) ^ $

?      的多重定义-懒惰限定符
*?      重复任意次,但尽可能少重复
+?        重复1次或更多次,但尽可能少重复
??        重复0次或1次,但尽可能少重复
{n,m}?      重复n到m次,但尽可能少重复
{n,}?       重复n次以上,但尽可能少重复


断言匹配: 有4个

(?=exp)     零宽先行断言,它匹配文本中的某些位置,这些位置的后面能匹配给定的后缀exp。
              比如\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分),
              zc:根据后缀匹配而已。和$区别在于$是行尾匹配。
              如I'm singing while you're dancing.  它会匹配sing和danc。

(?<=exp)    零宽后行断言,它匹配文本中的某些位置,这些位置的前面能给定的前缀匹配exp。
              如(?<=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分),
              zc:匹配前缀。
              例如在查找reading a book时,它匹配ading。

(?!exp)      零宽负向先行断言。会匹配后缀exp不存在的位置。
              zc: 若不是exp或者没有则匹配,用^在于存在一个不匹配某个exp的其他字符,
              而!保证不匹配exp外可以不跟任何字符。
              如:\d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字。
              也可以是只有前3位数字。比较\d{3}(^\d)有区别.

(?<!exp)     零宽负向后行断言。查找前缀exp不存在的位置.

常用语法:
1,正则里一些特殊字符
  () 将表达式结组
  [] 寻找一组字符
  \d 等于 [0-9]
  \D 等于 [^0-9]
  \w 等于 [0-9A-Za-z_]
  \W 等于 [^0-9A-Za-z_]
  \s 等于 [\f\n\r\t ]
  \S 等于 [^\f\n\r\t ]
  . 等于 [^\n]

2,关于一些特殊符号
  \b 不属于空白字符,向前缩进一个字符
  \t 属于空白字符,匹配制表符
  \r 属于空白字符,匹配回车符
  \a 不属于空白字符,匹配闹钟符
  \e 不属于空白字符,匹配转义符
  \033 不属于空白字符,匹配八进制符
  \x1B 不属于空白字符,匹配十六进制符
  \c[ 不属于空白字符,匹配控制字符
   属于空白字符,匹配空格
   属于空白字符,匹配制表符
  \f 属于空白字符,匹配换页符
  \n 属于空白字符,匹配换行符
  \0 不属于空白字符,功能不详
  \c 不属于空白字符,功能不详
  \x 不属于空白字符,功能不详

3,注意正则里的选择符的特殊性
  选择运算符是所有运算符中优先级最低的,这意味着它最后执行。

4,正则里的限定符的一些经典用法
  限定符常常与一些字符或词联合使用
  * 匹配任意数个;
  + 匹配一个或多个;
  ? 匹配零个或一个;
  {n} 匹配 n 个;
  {n,m} 匹配 n 至 m 个;
  {n,} 匹配 n 和 n 个以上;

  限定符贪婪好像与生俱有的。在缺省状态下,*或+限定符匹配满足正则表达式的一个范式的最大实例数。
  可用?号显式的规定限定符的不贪婪。如果问号放在另一个限制符之后(甚至另一个问号之后),都可以使限定符不贪婪。

5,声明与断言
  首先注意声明的长度为 0;
  Perl种有一组控制大小写和换码的声明:
  \u 使下一个字母变大写;
  \l 使下一个字母变小写;
  \U 使文本的剩余字符变成大写;
  \L 使文本的剩余字符变成小写;
  \Q 会除字母之外的其他字符进行换码处理,直至遇到 \E 声明、常规表达式结束或者字串结束。
  \A声明和脱字符号(^)匹配字串的开始;
  \Z声明和美元符号($)匹配字串的结束或刚好在字串结束前的换行符;
  \z 只匹配字串的结束;
  \b 匹配一个单词(字)边界;
  \B 匹配一个非单词(字)边界;

  (?#text) 忽略括号内的注释文本;
  (?:pattern) 与组一致,但匹配时不生成$1,$2;
  (?imsx:pattern) 与组一致,但匹配时不生成$1,$2,在特定的风格有效期间,内嵌风格匹配修饰符;
  (?=pattern) 前看声明,如果正则表达式在下一次匹配 pattern 风格,就开始匹配,而且不影响匹配效果。
    如/\w+(?=\t)/将匹配制表符是否恰好在一个字\w+后面出现,并且制表符不添加到$&的值中;
  (?!pattern) 如果正则表达式在后面不匹配 pattern ,才会开始匹配。如/foo(?!bar)/,只有当出现 foo,
    并且后面不出现 bar 时才开始匹配;
  (?<=pattern) 后看声明,只有在pattern已经匹配下面的表达式,并且不将 pattern 的结果放入$&变量中,
    才匹配下面的语句。如/(?<=\t)\W+/匹配制表符是否恰好在\W+前出现,但又不将制表符送到$& 中;
  (? (?{code}) 表示对 code 的使用是试验性的。如果返回真,就认为是与(?:pattern)断言同一行里的匹配。
    code 不插入变量。这个断言仅仅在 use re 'eval' 编译指示符时才有效;
  (?>pattern) 如果类型锁定在当前位置,就使用单独的 pattern 匹配子字符串。如正则表达式/^(?>a*)ab/永远不会匹配,
    因为语句(?>a*)将匹配字符串开头所有的 a 字符,并删除与 ab 匹配的字符 a;
  (!<=pattern) 非后看声明,与后看声明意思相反;
  (!=pattern) 非前看声明,与前看声明意思相反;
  (?(condition)yes-pattern|no-pattern) 条件表达式——条件语句或者是一个圆括号中的整数,或者是一个断言;
  (?(condition)yes-pattern)
  (?imsx) 嵌入风格匹配修饰符。当要把表达式修改符嵌入在变量中,然后把变量用在不指定自己的修饰符的一般规则表达式中;
  (?-imsx) 这个断言很有用——后面带任何内容都会关闭修饰符,直到出现另一个嵌入的修饰符。


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理