正则表达式

正则表达式
正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。

===================元字符=========================
\b是正则表达式规定的一个特殊代码 它只匹配一个位置。
假如你要找的是hi后面不远处跟着一个Lucy,你应该用\bhi\b.*\bLucy\b。

.是另一个元字符,匹配除了换行符以外的任意字符。


.*连在一起就意味着任意数量的不包含换行的字符。

 

\d是个新的元字符,匹配一位数字(0,或1,或2,或……)。
-不是元字符,
0\d{2}-\d{8} 以0开头,然后是两个数字,然后是一个连字号“-”,最后是8个数字(也就是中国的电话号码


\s匹配任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等。
\w匹配字母或数字或下划线或汉字等。

=====================字符类============================
[a-z0-9A-Z_]也完全等同于\w(如果只考虑英文的话)。
[ ] [aeiou]就匹配任何一个英文元音字母,[.?!]匹配标点符号(.或?或!)。

 

=====================字符转义=====================
\. \*


==================重复=====================
+是和*类似的元字符,不同的是*匹配重复任意次(可能是0次),而+则匹配重复1次或更多次。
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次

=======================================
^ 匹配字符串的开始
$ 匹配字符串的结束
QQ号必须为5位到12位数字时,可以使用:^\d{5,12}$
\b表示一个单词的边界


\p{Lower}表示任意小写字母
\p{Upper}表示任意大写字母
\p{Alpha}表示任意一个字母字符
\p{Alnum}表示任意一个字母 或数字字符
\p{Punct}表示任意一个标点符号
=============== ======分枝条件==============================
正则表达式里的分枝条件指的是有几种规则,如果满足其中任意一种规则都应该当成匹配,具体方法是用 | 把不同的规则分隔开。

匹配分枝条件时,将会从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了。

 

 


======================分组==================================
用小括号来指定子表达式(也叫做分组)
(\d{1,3}\.){3}\d{1,3}是一个简单的IP地址匹配表达式
正则表达式中并不提供关于数学的任何功


字符类来描述一个正确的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这几个字母以外的任意字符


<a[^>]+>匹配用尖括号括起来的以a开头的字符串。


=====================后向引用========================

(?'Word'\w+)),这样就把\w+的组名指定为Word了

要反向引用这个分组捕获的内容,你可以使用\k<Word>

 

 

表4.常用分组语法
分类 代码/语法 说明
捕获
(exp) 匹配exp,并捕获文本到自动命名的组里
(?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
(?:exp) 匹配exp, 不捕获匹配的文本,也不给此分组分配组号
零宽断言
(?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置
注释
(?#comment) 不对正则表达式的处理产生任何影响,用于提供注释让人阅读

====================零宽断言======================
(?=exp)也叫零宽度正预测先行断言
比如\b\w+(?=ing\b),singing while you're dancing.时,它会匹配sing和danc。
(?<=exp)也叫零宽度正回顾后发断言
它断言自身出现的位置的前面能匹配表达式exp。
(?<=\s)\d+(?=\s)匹配以空白符间隔的数字(再次强调,不包括这些空白符)。

====================负向零宽断言===================

负向零宽断言能解决这样的问题,因为它只匹配一个位置,并不消费任何字符。
匹配包含后面不是字母u的字母q的单词
\b\w*q(?!u)\w*\b。
零宽度负预测先行断言(?!exp),断言此位置的后面不能匹配表达式exp
\b((?!abc)\w)+\b匹配不包含连续字符串abc的单词。
零宽度负回顾后发断言:(?<!exp),断言此位置的前面不能匹配表达式exp


(?<=<(\w+)>).*(?=<\/\1>)匹配不包含属性的简单HTML标签内里的内容
如 (?<=<(\bdiv\b)>).*(?=<\/\1>)

 

==========================注释================
(?<= # 断言要匹配的文本的前缀
<(\w+)> # 查找尖括号括起来的字母或数字(即HTML/XML标签)
) # 前缀结束
.* # 匹配任意文本
(?= # 断言要匹配的文本的后缀
<\/\1> # 查找尖括号括起来的内容:前面是一个"/",后面是先前捕获的标签
) # 后缀结束


========================贪婪与懒惰===============

表5.懒惰限定符
代码/语法 说明
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复
正则表达式有另一条规则,比懒惰/贪婪规则的优先级更高:最先开始的匹配拥有最高的优先权

======================处理选项=======================
表6.常用的处理选项
名称 说明
IgnoreCase(忽略大小写) 匹配时不区分大小写。

Multiline(多行模式) 更改^和$的含义,使它们分别在任意一行的行首和行尾匹配 ,而不仅仅在整个字符串的开头和结尾匹配。(在此模式下,$ 的精确含意是:匹配\n之前的位置以及字符串结束前的位置.)

Singleline(单行模式) 更改 . 的含义,使它与每一个字符匹配(包括换行符\n)。
IgnorePatternWhitespace(忽略空白) 忽略表达式中的非转义空白并启用由#标记的注释。
ExplicitCapture(显式捕获) 仅捕获已被显式命名的组。

例子
< #最外层的左括号
[^<>]* #最外层的左括号后面的不是括号的内容
(
(
(?'Open'<) #碰到了左括号,在黑板上写一个"Open"
[^<>]* #匹配左括号后面的不是括号的内容
)+
(
(?'-Open'>) #碰到了右括号,擦掉一个"Open"
[^<>]* #匹配右括号后面不是括号的内容
)+
)*
(?(Open)(?!)) #在遇到最外层的右括号前面,判断黑板上还有没有没擦掉的"Open"; 如果还有,则匹配失败

> #最外层的右括号

匹配嵌套的<div>标签:<div[^>]*>[^<>]*(((?'Open'<div[^>]*>)[^<>]*)+((?'-Open'</div>)[^<>]*)+)*(?(Open)(?!))</div>.

 

posted @ 2014-11-27 12:09  韩小醋  阅读(347)  评论(0编辑  收藏  举报