posts - 0, comments - 77, trackbacks - 0, articles - 356
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

正则表达式语法

Posted on 2008-05-28 10:13 semovy 阅读(3864) 评论(0)  编辑  收藏 所属分类: 正则表达式
Regular Mode & Behavior
名称 英文 字符/格式 描述



元字符 Meta Character { } [ ] ( ) \ / ^ $ * + . , ? | : = ! - 元字符是正则表达式语法的一部分。任何时候要在正则表达式中使用这些元字符,都必须对它们进行转义,即其前加上反斜线。另外,在某些编程语言中,反斜线“\”通常用来进行转义操作,那么此时使用元字符时,就要进行双重转义,即先转义反斜线再转义元字符。
特殊字符 Special Character \t \n \r \f \a \e \cX \B \V \0 通常是一些不可见的格式控制符号,使用时也应该注意双重转义。


简单类 Simple Class [...] 指定要包含的字符。
负向类 Negation Class [^...] 指定要排除的字符。
范围类 Range Class [...-...] 指定要包含的字符有序序列。
负向范围类 Negative Range Class [^...-...] 指定要排除的字符有序序列。
组合类 Combination Class 由几种字符类组合而成的字符类(内部类之间不能有空格)。组合类中允许出现简单类、负向类、范围类、预定义类。
联合类 Union Class
交叉类 Intersection Class
预定义类 Predefined Class . \d \D \s \S \w \W \xXX \XXX \uXXXX 某些反复用到的模式被预先定义,可以方便地指定复杂的模式,也使模式的匹配变得更简单。

量词 Quantifier 用于指定某个特定模式出现的次数。当指定某个模式应当出现的次数时,可以指定硬性数量或指定软性数量。量词使用在某个模式的后面,用以限定该模式在字符串中出现的次数。
贪婪(简单)量词 Greedy Quantifier ? * + {n} {n,m} {n,} 先看整个的字符串是不是一个匹配。如果没有发现匹配,它去掉最后字符串中的最后一个字符,并再次尝试。如果还是没有发现匹配,那么再次去掉最后一字符,这个过程会一直重复直到发现一个匹配或者或者字符串不剩任何字符。
惰性量词 Inert Quantifier ?? *? +? {n}? {n,m}? {n,}? 先看字符串中第一个字符是不是一个匹配。如果单独这一个字符还不够,就读入下一个字符,组成两个字符的字符串。如果还是没有发现匹配,惰性量词继续从字符串中添加字符直到发现一个匹配或者整个字符串都检查过也没有匹配。当发现一个匹配后,忽略前面已经匹配的字符串,接着从字符串的下一个字符开始进行新的匹配检查。惰性量词和贪婪量词的工作方式恰好相反。
支配性量词 Dominant Quantifier ?+ *+ ++ {n}+ {n,m}+ {n,}+ 尝试匹配整个字符串。如果整个字符串不能产生匹配,不做进一步尝试。




(捕获性)分组 Capture Group (...) 通过一系列圆括号包围一系列字符、字符类以及量词来使用。它可以处理特定的字符或字符序列的重复问题。通过混合使用字符、字符类和量词,可以实现一些相当复杂的分组,同时也不介意将分组放在分组间。
反向引用 Back-Reference 每个捕获性分组在使用后都被存放在一个特殊的地方以备将来使用,这些存储在分组中的特殊值,叫做“反向引用”。反向引用是按照从左到右遇到的左圆括号字符的顺序进行创建和编号的。在正则表达式中,反向引用可以从构造函数、转义 \n、$n 等形式中获取。
非捕获性分组 No-Capture Group (?:...) 只有捕获性分组才能创建反向引用,非捕获性分组无法创建。在较长的正则表达式中,存储反向引用会降低匹配速度。通过使用非捕获性分组,仍然可以拥有与匹配字符串序列同样的能力,而无需存储结果的开销。非捕获性分组不能使用任何形式的反向引用。
候选 Candidate ...|... 候选项可以是任意多个,在两两模式之间加上竖线,用于匹配可能的模式。

前瞻 Look-Ahead 它告诉正则表达式运算器向前看一些字符而不移动其位置。前瞻会使用到圆括号,但这不是分组,分组是不会考虑前瞻的存在(无论是正向还是负向)。若在分组中使用前瞻,无论是正向还是负向,都可以使用分组的反向引用,但该反向引用中并不包含前瞻模式串。
正向前瞻 Forward Look-Ahead (?=...) 检查的是接下来出现的是不是某个允许的特定字符集。
负向前瞻 Negation Look-Ahead (?!...) 检查的是接下来出现的是不是不应该出现的特定字符集。
后瞻 Look-Behind 匹配 b 当且仅当它前面没有 a
边界 Boundary ^ $ \b \B 用于正则表达式中以表示模式的位置。
多行模式 Multiline m (设置多行模式为 True) 只要在正则表达式中设置多行模式为 True 即可。它会让 $ 边界匹配换行符 \n 以及字符串真正的结尾。多行模式会让 ^ 边界匹配换行符之后的位置。

Classic Regular Application
名称 变量 正则表达式



英文字母 Character ^[A-Za-z]+$
英文大写字母 Lower-Char ^[A-Z]+$
英文小写字母 Upper-Char ^[a-z]+$
字母和数字 Char-Int ^[A-Za-z0-9]+$
整数 Integer ^-?\d+$
正整数 SL-Int ^[0-9]*[1-9][0-9]*$
非正整数 NOT-SL-Int ^((-\d+)|(0+))$
负整数 NT-Int ^-[0-9]*[1-9][0-9]*$
非负整数 NOT-NT-Int ^\d+$
浮点数 Float-Num ^(-?\d+)(\.\d+)?$
正浮点数 SL-Float ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
非正浮点数 NOT-SL-Float ^((-\d+(\.\d+)?)|(0+(\.0+)?))$
负浮点数 NT-Float ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$
非负浮点数 NOT-NT-Float ^\d+(\.\d+)?$
双字节字符(包括中文) D-Byte-Char [^\x00-\xff]
空行 Blank-Line \n\s*\r



电子邮件 E-mail ^([a-z0-9])(([\-.]|[_]+)?([a-z0-9]+))*(@)([a-z0-9])((([-]+)?([a-z0-9]+))?)*((.[a-z]{2,3})?(.[a-z]{2,6}))$
网址 URL ^((https|http|ftp|rtsp|mms)://)(([0-9a-z_!~*’().&=+$%-]+: )?[0-9a-z_!~*’().&=+$%-]+@)?(([0-9]{1,3}\.){3}[0-9]{1,3}|([0-9a-z_!~*’()-]+\.)*([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\.[a-z]{2,6})(:[0-9]{1,4})?((/?)|(/[0-9a-z_!~*’().;?:@&=+$,%#-]+)+/?)$
IP 地址 IP ^([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])$
身份证 ID-Card ^\d{15}|\d{18}$
电话号码 Phone ^\d+$
邮政编码 Zip-Code ^[1-9]\d{5}(?!\d)$
金额 Money ^\d+\.\d{2}$
帐号 Account ^\w{6,15}$
密码 Password ^\w{6,15}$
中文 Chinese [\u4e00-\u9fa5]

Conception & History

正则表达式 Regular Expression(regexp,regex,regxp),正规表达式,正规表示式,常规表达式,“模式”。
正则表达式是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。

最初的正则表达式出现于理论计算机科学的自动控制理论和形式语言理论中。
在这些领域中有对计算(自动控制)的模型和对形式语言描述与分类的研究。
1940 年代,Warren McCulloch 与 Walter Pitts 将神经系统中的神经元描述成小而简单的自动控制元。
稍后,数学家 Stephen Kleene 利用称之为正则集合的数学符号来描述此模型。
Ken Thompson 将此符号系统引入编辑器 QED,然后是 Unix 上的编辑器 ed,并最终引入 grep。
自此,正则表达式被广泛地使用于各种 Unix 或者类似 Unix 的工具,例如 Perl。

Quantifier
贪婪(简单)量词 惰性量词 支配性量词 描述
? ?? ?+ 零次或一次出现
* *? *+ 零次或多次出现
+ +? ++ 一次或多次出现
{n} {n}? {n}+ 恰好 n 次出现
{n,m} {n,m}? {n,m}+ 至少 n 次至多 m 次出现
{n,} {n,}? {n,}+ 至少 n 次出现

Meta Character
字符 描述 字符 描述
{} 花括号 - 减号
[] 方括号 . 点号
() 圆括号 , 逗号
\ 反斜线 ? 问号
/ 正斜线 | 竖线
^ 箭头符号 : 冒号
$ 美圆符号 = 等号
* 星号 ! 感叹号
+ 加号

Boundary

字符 描述
^ 行开头
$ 行结尾
\b 单词的边界
\B 非单词的边界

Predefined Class
代码 等同于 匹配
. [^\n\r] 除了换行和回车之外的任意字符
\d [0-9] 数字字符
\D [^0-9] 非数字字符
\s [ \t\n\x0B\f\r] 空白字符
\S [^ \t\n\x0B\f\r] 非空白字符
\w [a-zA-Z_0-9] 单词字符(所有字母、数字和下划线)
\W [^a-zA-Z_0-9] 非单词字符
\xXX 十六进制 ASCII 码字符
\XXX 八进制 ASCII 码字符
\uXXXX 十六进制 Unicode 码字符

Special Character
字符 描述
\t 制表符
\n 换行符
\r 回车符
\f 换页符
\a alert 字符
\e escape 字符
\cX X 相对应的控制字符
\b 回退字符
\v 垂直制表符
\0 空字符

Regular Precedence Level
字符 描述 优先级
\ 转义 1
() (?:) (?=) [] 分组 2
* + ? {n} {n,m} {n,} 量词 3
^ $ \anymetacharacter 位置和顺序 4
| 候选 5
注:从左至右求值。

^[1-9]\d{5}(?!\d)$邮编

^((\(\d{3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}$电话

^(([0\+]\d{2,3})?(0\d{2,3}))?(\d{7,8})(-(\d{3,}))?$ //电话

^((\(\d{3}\))|(\d{3}\-))?13\d{9}|15[89]\d{8}$手机

^(((13[0-9]{1})|150|151|152|153|155|156|157|158|159)+\d{8})$ 手机


只有注册用户登录后才能发表评论。


网站导航: