一、什么是正则表达式?
简单的说:正则表达式(Regular Expression)是一种处理字符串匹配的语言;
正则表达式描述了一种字符串匹配的模式,可以用来检查一个字符串是否含有某种子串,对匹配到的子串进行“取出”或“替换”操作。
二、正则表达式的应用
正则表达式在实际的开发过程中非常实用,能够快速解决一些复杂的字符串处理问题,下面我对正则表达式的应用做一些简单分类:
第一种:数据验证
比如,你要验证一个字符串是否是正确的EMail,Telphone,Ip等等,那么采用正则表达式就好非常方便。
第二种:内容查找
比如,你要抓取一个网页的图片,那么你肯定要找到<img>标签,这时候用正则表达式就可以精准的匹配到。
第三种:内容替换
比如,你要把手机号码中间四位隐藏掉变成这种模式,123****4567,那么采用正则表达式也会非常方便。
三、正则表达式有哪些内容
下面我将简单的介绍一下正则表达式:
1、 正则表达式的几个重要的概念
•子表达式:在正则表达式中,如果使用"()"括起来的内容,称之为“子表达式”
•捕获:子表达式匹配到的结果会被系统放在缓冲区中,这个过程,我们称之为“捕获”
•反向引用:我们使用"\n",其中n是数字,表示引用之前某个缓冲区之间的内容,我们称之为“反向引用”
2、数量限定符
•X+ 表示:1或多个
•X* 表示:0或多个
•X? 表示:0或1个
•X{n} 表示: n个
•X{n,} 表示:至少n个
•X{n,m} 表示:n至m个,贪婪原则,会尽可能匹配多个;如果在后面加个?,则为非贪婪原则
注:X表示要查找的字符
3、 字符限定符
•\d 表示:匹配一个数字字符,[0-9]
•\D 表示:匹配一个非数字字符,[^0-9]
•\w 表示:匹配包括下划线在内的单词字符,[0-9a-zA-Z_]
•\W 表示:匹配任何非单词字符,[^0-9a-zA-Z_]
•\s 表示:匹配任何空白字符,空格、回车、制表符
•\S 表示:匹配任何非空白字符
•. 表示:匹配任何单个字符
自定义集合:
范围字符:[a-z]、[A-Z]、[0-9]、[0-9a-z]、[0-9a-zA-Z]
任意字符:[abcd]、[1234]
非在内的字符:[^a-z]、[^0-9]、[^abcd]
4、 定位符
•^ 表示:开头标识
•$ 表示:结尾标识
•\b 表示:单词边界
•\B 表示:非单词边界
5、转义符
•\ 用于匹配某些特殊字符
6、分支结构
•| 可以匹配多个规则
7、特殊用法
•(?=) : 正向预查:匹配以指定内容结束的字符串
•(?!) : 负向预查:匹配不是以指定内容结束的字符串
•(?:) : 不把选择匹配符的内容放到缓冲区
8、转义字符转义序列
一些不可见字符,或是在正则中具有特殊意义的元字符,如想匹配字符本身,需要用“\”对其进行转义。
\\ | 匹配”\” |
\. | 匹配“.” |
\* | 匹配“*” |
\( | 匹配“(” |
\) | 匹配”)” |
\? | 匹配“?“ |
\+ | 匹配“+“ |
\| | 匹配“|“ |
\{ | 匹配“{“ |
\} | 匹配“}“ |
\^ | 匹配“^“ |
\$ | 匹配“$“ |
\n | 匹配换行符 |
\r | 匹配回车 |
\t | 匹配Tab键 |
\v | 匹配垂直制表符 |
\f | 匹配换页符 |
\b | 匹配退格 |
\xnn | 匹配一个二位16进制数指定的ASCII字符,例如\x43匹配C |
\unnnn | 匹配一个4位16进制数指定的Unicode字符 |
\cV | 匹配一个控制字符,(如复制Ctrl+C) |
9、分组
分组技术可以匹配在一个组中的所有字符,用()来表示,是下面两个技术的基础所在。“()“又称捕获符号。
1. 捕获:()
例子:ABC1EDF2UU
匹配组表达式:([A-Z]{3})\d --匹配3个连续大写字母和一个数字
匹配结果:1.ABC1,2.EDF2
如果用C#中的group,则为ABC,EDF。因为group搜集的是匹配组的内容。
2.非捕获(?:)
使用了非捕获就说明该()中的内容将不作为捕获的组返回,而和其它表达式共同构成匹配项返回。也就是捕获组将不存在。
例:1AF3EDC
匹配表达式:(?:\d|[A-Z])\w --匹配一个数字或字母加一个任意的字符。
匹配结果:1.1A 2.F3 3.ED
没有组被捕获
2. 通过名称捕获(?<name>)
定义了名称捕获的组可以在反向匹配中运用名称进行反向引用而不需要再使用数字进行反向捕获。注意组名区分大小写!
10、替换
替换,顾名思义,是将匹配的字符替换成其他指定的字符形式。这个功能是在分组的基础上的(当然或许可以单独存在,但是那样匹配的功能显然不够强大)。在这里有一个技巧是使用附加的匹配字符控制匹配内容。
$group | 用group指定的组号进行替换 |
${name} | 替换由<?name>匹配的最后一个子串 |
$$ | 替换字符$ |
$& | 替换整个的匹配 |
$+ | 替换最后捕获的组 |
$ | 替换整个输入的字符串 |
11、反向引用
反向引用通常用来查找重复的子串,或是限定某一子串成对出现。
表达式 | 说明 |
\1,\2 | 对序号为1和2的捕获组的反向引用 |
\k<name> | 对命名为name的捕获组的反向引用 |
举例:
“(a|b)\1”在匹配“abaa”时,匹配成功,匹配到的结果是“aa”。“(a|b)”在尝试匹配时,虽然既可以匹配“a”,也可以匹配“b”,但是在进行反向引用时,对应()中匹配的内容已经是固定的了。
关于正则表达式的() [] {}有不同的意思。
() 是为了提取匹配的字符串。表达式中有几个()就有几个相应的匹配字符串。
(\s*)表示连续空格的字符串。
[]是定义匹配的字符范围。比如 [a-zA-Z0-9] 表示相应位置的字符要匹配英文字符和数字。[\s*]表示空格或者*号。
{}一般用来表示匹配的长度,比如 \s{3} 表示匹配三个空格,\s[1,3]表示匹配一到三个空格。
(0-9) 匹配 '0-9′ 本身。 [0-9]* 匹配数字(注意后面有 *,可以为空)[0-9]+ 匹配数字(注意后面有 +,不可以为空){1-9} 写法错误。
[0-9]{0,9} 表示长度为 0 到 9 的数字字符串。
POSIX 类 perl类 描述
----------------------------------------------------------------------------
[:alnum:] 字母和数字
[:alpha:] \a 字母
[:lower:] \l 小写字母
[:upper:] \u 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] \s 所有空格符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] \d 十进制数字
[:xdigit:] \x 十六进制数字
[:graph:] 可打印的非空白字符
[:print:] \p 可打印字符
[:punct:] 标点符号