正则表达式学习笔记

来源:互联网 发布:java字符串转整型 编辑:程序博客网 时间:2024/05/22 10:55
参考:正则表达30分钟入门教程
http://www.cnblogs.com/netshuai/archive/2007/09/20/900032.html

基本语法

*    重复0次或多次
+     重复1次或多次
?     重复0次或1次
{m}     重复m次
{m,}     重复m次或更多次
{m,n}     重复m次到n次

.     匹配换行符外的任意一个字符
\w     匹配一个字母或数字或下划线或汉字
\s     匹配任意一个空白字符
\d     匹配一个数字
\b     匹配一个单词的开始或结束
^     匹配字符串的开始
$     匹配字符串的结束

[abcde]     匹配abcde中的一个字符
[^abcde]     匹配非abcde中的一个字符
[a-z0-9A-Z]     匹配a-z,0-9,A-Z中的一个字符

|     或; 分支条件
()     分组
\     转义字符

分支条件
使用‘|’来标明分支,分支条件的顺序是从左到右
eg.
0\d{2}-\d{8}|0\d{3}-\d{7}     匹配两种电话号010-12345678和0375-1234567

分组
用()括起来的就是一个分组,是一个子表达式
eg.
(\d{1,3}\.){3}\d{1,3}表式一个IP地址,不过256.300.888.999这样的非法地址也在匹配之列

每个分组自动有一个组号,从左至右,以左括号为标志,组号从1开始累加
向后引用用于重复前匹配的文本,用\组号来引用,eg.
\b(\w+)\b\s+\1\b来匹配如go go这样的重复单词

常用分组语法
(exp)     匹配exp,并捕获内容到自动命名的组里,引用方式\组号
(?<name>exp)     匹配exp,并捕获内容到名为name的组里,引用方式\k<name>
(?:exp)     匹配exp,不捕获也不分配组号

(?=exp)     匹配exp前面的位置,eg. \bw+(?=ing\b)匹配以ing结尾的单词的前面部分,如reading的read
(?<=exp)     匹配exp后面的位置,eg. (?<=\bre)\w+\b匹配以re开头的单词的后面部分,如reading的ading
(?!exp)     匹配后面不是exp的位置,eg. \d{3}(?!\d)匹配三个数字,这三个数字后面不能是数字
(?<!exp)     匹配前不是exp的位置,eg. (?<![a-z])\d{7}匹配7个数字,前面不能是小写字母

(?#comment)     注释,comment中可以包括换行符等

贪婪与懒惰
默认情况下正则会尽可能多的匹配,如用a.*b来搜索aabab,会匹配aabab而不是aab

懒惰是尽可能的少匹配,如果需要懒惰匹配,则只需要在表重复的元字符后加?
懒惰限定符语法:
*?     重复任意次,但尽可能地少重复
+?     重复1次或多次,但尽可能地少重复
??     重复0次或1次,但尽可能地少重复
{m,n}?     重复m次到n次,但尽可能地少重复
{n,}?     重复n次或更多闪,但尽可能地少重复



原创粉丝点击