学习之路——正则表达式(上)
2016-09-20 12:15
337 查看
转载请注明出处
[我的博客]http://www.lostbug.com
虽然英文单词的开始或结束 常以空格、标点符号、换行来标识,但”\b”并不匹配这些单词分割符号的任意一个,它只匹配一个位置
“*”同样是元字符,不过它代表的不是字符,也不是位置,而是数量——它指”*”前面的内容可以重复任意次数,以使表达式得到匹配。
“.*”就表示任意不包含还换行符的重复字段,整个表达式表示:hi+任意字符(不包括换行符)+Lucy
\s 元字符 匹配任意空白符,包括空格、制表符、换行符,中文全角空格等
\w 匹配 字母、数字、下划线、汉字等
$ 匹配字符串的结束
匹配5-12数字
[.?!] 匹配[]中的. ? !任意一个
[0-9]代表的含意与\d就是完全一致的;同理[a-z0-9A-Z_]也完全等同于\w(如果只考虑英文的话)
(?0\d{2}[) -]?\d{8}
(?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位)。原因是匹配分枝条件时,将会从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了
((2[0-4]\d|25[0-5]|[01]?\d\d?).){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)
< a[^>]+>匹配尖括号括起来的以a开头的任意字符串
\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。比如(?<=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找reading a book时,它匹配ading。
例 (?<=\s)\d+(?=\s)
例
注:大部分代码参照 http://deerchao.net/tutorials/regex/regex.htm
[我的博客]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] | 匹配元音字母以外的任意字符 |
反向引用
使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为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
相关文章推荐
- 学习之路——正则表达式(下)
- Python学习之路-装饰器&生成器&正则表达式
- Java学习之路:不走弯路,就是捷径
- JAVA学习之路
- JAVA学习之路:不走弯路,就是捷径
- Java学习之路:不走弯路,就是捷径 www.51testing.com
- 未来美好憧憬:计算机之路漫漫兮,悠悠载,希望到研究生的时候能够组成一个大家自己的团队,一起学习,开发,研究...
- 【学习之路】程序员 如何掌握 计算专业机英语
- JAVA学习之路:不走弯路,就是捷径
- JAVA学习之路:不走弯路,就是捷径
- Java学习之路:不走弯路,就是捷径 (1)
- JasperReport 学习之路
- 我的vc学习之路——山穷水尽疑无路,柳暗花明又一村
- JAVA学习之路:不走弯路,就是捷径(二)
- JAVA学习之路:不走弯路,就是捷径
- JAVA学习之路:不走弯路,就是捷径(一)
- JasperReport 学习之路
- Visual Studio .NET学习之路
- JAVA学习之路:不走弯路,就是捷径
- Java学习之路:不走弯路,就是捷径