正则表达式

9/6/2015来源:Java教程人气:2559

正则表达式

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

===================元字符=========================\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>.