您的位置:首页 > 其它

学习之路——正则表达式(上)

2016-09-20 12:15 337 查看
转载请注明出处

[我的博客]http://www.lostbug.com

\bhi\b

\b 是正则表达式的一个特殊字符(元字符,metacharacter),代表单词的开头或结尾,即起始位置。

虽然英文单词的开始或结束 常以空格、标点符号、换行来标识,但”\b”并不匹配这些单词分割符号的任意一个,它只匹配一个位置

\bhi\b.*\bLucy\b

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

“*”同样是元字符,不过它代表的不是字符,也不是位置,而是数量——它指”*”前面的内容可以重复任意次数,以使表达式得到匹配。

“.*”就表示任意不包含还换行符的重复字段,整个表达式表示:hi+任意字符(不包括换行符)+Lucy

0\d{2}-\d{8}

\d 元字符,匹配一位数字,d后面的{2}、{8}表示前面的\d必须连续重复匹配的次数

\s 元字符 匹配任意空白符,包括空格、制表符、换行符,中文全角空格等

\w 匹配 字母、数字、下划线、汉字等

\d+

“+” 类似*“,不过“*”是重复任意次数(包括0次),“+”是重复1次或以上

\b\w{6}\b

匹配6个字符的单词

^\d{5,12}$

^ 匹配字符串的开始

$ 匹配字符串的结束

匹配5-12数字

重复

代码/语法说明
*重复0次或更多次
+重复一次或更多次
重复零次或一次
{n}重复n次
{n,}重复n次或更多次
{n,m}重复n到m次

字符类

[aeiou] 匹配任意元音字母

[.?!] 匹配[]中的. ? !任意一个

[0-9]代表的含意与\d就是完全一致的;同理[a-z0-9A-Z_]也完全等同于\w(如果只考虑英文的话)

(?0\d{2}[) -]?\d{8}

分枝条件

0\d{2}-\d{8}|0\d{3}-\d{7}

(?0\d{2})?[- ]?\d{8}|0\d{2}[- ]?\d{8}

\d{5}-\d{4}|\d{5} 使用分枝条件时,要注意各个条件的顺序。如果你把它改成\d{5}|\d{5}-\d{4}的话,那么就只会匹配5位的邮编(以及9位邮编的前5位)。原因是匹配分枝条件时,将会从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了

分组

(\d{1,3}.){3}\d{1,3}

((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]匹配元音字母以外的任意字符
< a[^>]+>匹配尖括号括起来的以a开头的任意字符串

反向引用

使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。

\b(\w+)\b\s+\1\b

可以自己指定子表达式的组名

要指定一个子表达式的组名,请使用这样的语法:(?< Word>\w+)(或者把尖括号换成’也行:(?’Word’\w+)),这样就把\w+的组名指定为Word了。要反向引用这个分组捕获的内容,你可以使用\k< Word>

\b(?< Word>\w+)\b\s+\k< Word>\b

注:<与Word间没空格,找不到转义符号

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

零宽断言

(?=exp)也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp。比如\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I’m singing while you’re dancing.时,它会匹配sing和danc。

(?<=exp)也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp。比如(?<=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找reading a book时,它匹配ading。

例 (?<=\s)\d+(?=\s)

负向零宽断言

零宽度负预测先行断言(?!exp),断言此位置的后面不能匹配表达式exp。例如:\d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字;\b((?!abc)\w)+\b匹配不包含连续字符串abc的单词

(?<!exp)
,零宽度负回顾后发断言来断言此位置的前面不能匹配表达式
exp:(?< ![a-z])\d{7}
匹配前面不是小写字母的七位数字

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

注释

小括号的另一种用途是通过语法(?#comment)来包含注释。例如:2[0-4]\d(?#200-249)|250-5|[01]?\d\d?(?#0-199)。

注:大部分代码参照 http://deerchao.net/tutorials/regex/regex.htm
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: