正则表达式
1.基本概念:
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
或者可以这样理解:正则表达式是一种通过“匹配”字符串的方法,以“行”为单位进行字符串的处理,通过一些特殊符号的辅助,可以让用户轻松搜索或替换特定字符串。
2.优点:
正则表达式虽然极其简洁,但是它有自己的语法和规则,其功能非常灵活和强大。
3.正则表达式的用途:
a.可以让用户轻松搜索或替换特定字符串。
b.分析系统日志信息。
c.筛选垃圾邮件。
d.搜索引擎的关键词匹配等。
4.原子:
a.原子是正表达式最基本组成单元;
b.每个模式中至少包含一个原子;
c.原子字符包括所有的英文字母、数字、标点符号以及其他一些符号。原子也包括以下内容。
——单个字符、数字,如a~z,A~Z,0~9。
——模式单元,如(ABC)可以理解为由多个原子组成的大的原子。
——原子表,如[ABC]。
——普通转义字符,如:\d, \D, \w, \W, \s, \S。
——重新使用的模式单元,如:\\1。
——转义元字符,如:\*, \. 。
5.普通转义字符:
\d | 匹配一个数字;等价于[0-9] |
\D | 匹配出数字以外任何一个字符;等价于[^0-9] |
\w | 匹配一个英文字母、数字或下划线;等价于[0-9a-zA-Z] |
\W | 匹配除英文字母、数字或下划线以外任何一个字符;等价于[^0-9a-zA-Z] |
\s | 匹配一个空白字符;等价于[\f\n\r\t\v] |
\S | 匹配除空白字符以外任何一个字符;等价于[^\f\n\r\t\v] |
\f | 匹配一个换页符等价于;\x0c或\cL |
\n | 匹配一个换行符;等价于\x0a或\cJ |
\r | 匹配一个回车符;等价于\x0d或\cM |
\t | 匹配一个制表符;等价于\x09\或\cI |
\v | 匹配一个垂直制表符;等价于\x0b或\ck |
6.通用字符类型:
匹配相应类型中的一个字符共有6种:\d,\D,\s,\S,\w,\W
7.原子表-方括号表达式:
a.原子表 "[]"中存放一组原子,彼此地位平等,且仅匹配其中的一个原子。如果相匹配一个 “a”或“e”使用[ae]。
例如:Pr[ae]y匹配“Pray”或者“prey”。
b.原子表 "[^]"或者成为派出原子表,匹配除表内原子外的任意一个字符。
例如:/p[^u]/匹配"part"中的“pa”,但是无法匹配“computer”中的“pu”因为“u”在匹配中被排除。
c.原子表 "[-]"用于连接一组按ASCII码顺序排列的原子,简化书写。
例如:/x[0123456789]/可以写成/x[0-9]/,用来匹配一个由“x”字母与一个数字组成的字符串。
8.元字符(Meta-character)
元字符是用于构造规则表达式的具有特殊含义的字符。如果要在正则表达式中包含元字符本身,必须在其前加上 “\” 进行转义。
元字符 | 说明 |
* | 0次、1次或多次匹配其前的原子 |
+ | 1次或多次匹配其前的原子 |
? | 0次或1次匹配其前的原子 |
| | 匹配两个或多个选择 |
^或\A | 匹配字符串串首的原子 |
$或\Z | 匹配字符串串尾的原子 |
\b | 匹配单词的边界 |
\B | 匹配除单子边界以外的部分 |
[] | 匹配方括号中的任一原子 |
[^] | 匹配除方括号的原子外的任何字符 |
{m} | 表示其前原子恰好出现m次 |
{m,n} | 表示其前原子至少出现m次,最多出现n次(n>m) |
{m,} | 表示其前原子出现不少于m次 |
() | 整体表示一个原子 |
. | 匹配除换行之外的任何一个字符 |
a、定位符:^和$
作用:描述字符串或单次的边界。
例如,在字符串“Tom and Jerry chased each other in the house until Tom's uncel come in ”中。
元字符“^”或"\A"置于字符串的开始确保模式匹配出现在字符串首端;
/^Tom/
元字符“$”或“\Z”置于字符串的结束,确保模式匹配出现字符串尾端。
/in$/
如果不加边界限制元字符,将获得更多的匹配结果。
/^Tom$/精确匹配 /Tom/模糊匹配
b、单词边界限制
在使用各种编辑软件的查找功能时,可以通过选择“按单词查找”获得更准确的结果。正则表达式中也提供类似的功能。
例如:在字符串“This island is a beautiful land”中
元字符“\b”对单词的边界进行匹配;
/\bis\b/匹配单词“is”。不匹配“This”和“island”。
/\bis/匹配单词“is”和“island”中的“is”,不匹配“This”。
元字符“\B”对单词边界以外的部分进行匹配。
/\Bis\B/将明确的只是不与单词的左、右边界匹配,只匹配单词的内部。所以在这个例子中没有结果。
/\Bis/匹配单词中的“This”中的“is”
9.限定符:
正则表达式中有一些用于重复匹配某些原子的元字符:*、+、?、{n}、{n,}、{n,m},他们主要的区别是重复匹配的次数不同。
a.元字符“?”:表示0次或1次匹配紧接在其前的原子。
例如:/colour?r/匹配“colour”或“color”。
b.元字符“*”:表示0次、1次或多次匹配紧接在其前的原子。
例如:/zo*/可以匹配z、zoo。
c.元字符“+”:表示1次或多次匹配紧接在其前的原子。
例如:/go+gle/匹配 "gogle"、"google" 或"gooogle"等中间含有多个o的字符串。
d.元字符“{}”:准确的指定原子重复的次数。
“{m}”表示其前原子恰好出现m次;
“{m,n}”表示其前原子至少出现m次,至多出现n次;
“{m,}”表示其前原子出现不少于m次。
例如:
/zo{1,3}m/只能匹配字符串“zom”、“zoom”或“zooom”。
/zo{3}m/只能匹配字符串“zooom”。
/zo{3,}m/可以匹配以“z”开头,“m”结束,中间至少为3个“o”的字符串。
/bo{0,1}u/可以匹配字符串“bought a butter”中的“bou”和“bu”,等价于bo?u。
10.常用正则表达式:
正则表达式 | 用途 |
/[a-zA-Z]/ | 匹配所有大小写字母 |
/[^0-9a-zA-Z_]/ | 匹配除英文字母、数字、小花仙以外任何一个字符,其等价于 \W |
/<[A-Za-z][A-za-z0-9]*>/ | 可以匹配“”、“”或“”等HTML标签,并且不严格的控制大小写 |
/^[a-zA-Z][a-zA-Z0-9_]{4,15}$/ | 匹配账号是否合法(字母开头,允许5-16字节,允许字母数字下划线) |
/\d{3}-\d{8}|\d{4}-\d{7}/ | 匹配国内电话号码。匹配形式如:0511-4405222或者021-87888822 |
/\d{15}|\d{18}/ | 匹配省份证。中国的省份证为15位或者18位 |
/^[A-Za-z]+$/ | 匹配由26个英文字母组成的字符串 注:26并不是代表字符串长度哦 |
/^[A-Z]+$/ | 匹配由26个大写英文字母组成的字符串 |
/^[a-z]+$/ | 匹配由26个小写英文字母组成的字符串 |
/^[A-Za-z0-9]+$/ | 匹配由数字和26个英文字母组成的字符串 |
/^\w+$/ | 匹配由数字、26个英文字母或者下划线组成的字符串 |
/^[1-9]\d*$/ | 匹配正整数 |
/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/ | 匹配Email地址 |