犀牛 ——第10章 正则表达式的模式匹配 10.1 正则表达式的定义
2015-09-09 23:08
387 查看
10.1正则表达式的定义
JavaScript中的正则表达式用RegExp对象表示,可以使用RegExp()构造函数来创建RegExp对象,不过RegExp对象,不过RegExp对象更多的是通过一种特殊的直接量语法来创建。正则表达式直接量定义为包含在一对斜杠(/)之间的字符,例如:var pattern = /s$/;
用构造函数RegExp()也可以定义个与之等价的正则表达式,代码如下:
var pattern = new RegExp("s$");
运行上面两行代码创建一个新的RegExp对象,并将它赋值给变量pattern。这个特殊的RegExp对象用来匹配所有以字母“s”结尾的字符串。
10.1.1 直接量字符
正则表达式中的所有字母和数字都是按照字面含义进行匹配的。JavaScript正则表达式语法也支持非字母的字符匹配,这些字符需要通过反斜杠(\)作为前缀进行转义。表10-1:正则表达式中的直接量字符
字符 | 匹配 |
字母和数字字符 | 自身 |
\o | NULL字符 |
\t | 制表符 |
\n | 换行符 |
\v | 垂直制表符 |
\f | 换页符 |
\r | 回车符 |
\xnn | 由十六进制数nn指定的拉丁字符,例如,\xOA等价于\n |
\uxxx | 由十六进制数xxxx指定的Unicode字符,例如\u0009等价于\t |
\cX | 控制字符^X, |
10.1.2 字符类
将直接量字符串单独放进方括号内就组成了字符类。一个字符类可以匹配它所包含的任意字符。因此,正则表达式/[abc]/就和“a”、“b”、“c”中的任意一个都匹配。字符类可以使用连字符来表示字符范围。要匹配拉丁字母表中的小写字母,可以使用/a-z/.
表10-2:正则表达式的字符类
字符 | 匹配 |
[...] | 方括号内的任意字符 |
[^...] | 不在方括号内的任意字符 |
. | 除换行符和其他Unicode行终止符之外的任意字符 |
\w | 任意ASCII字符组成的单词,等价于[a-zA-Z0-9] |
\W | 任意不是ASCII字符组成的单词,等价于[^a-zA-Z0-9] |
\s | \s任意Unicode空白符 |
\S | \S任意非Unicode空白符的字符,注意\w和\S不同 |
\d | 任何ASCII数字,等价于[0-9] |
\D | 除了ASCII数字之外的任何字符,等价于[^0-9] |
[\b] | 退格直接量(特例) |
10.1.3重复
在正则模式之后跟随用以指定字符重复的标记。由于某些重复种类非常常用,因此就有一些专门用于表示这种情况的特殊字符。表10-3:正则表达式的重复字符语法
字符 | 含义 |
{n,m} | 匹配前一项至少n次,但不能超过m次 |
{n,} | 匹配前一项n次或者更多次 |
{n} | 匹配前一项n次 |
? | 匹配前一项0次或者1次,也就是说前一项是可选的,等价于{0,1} |
+ | 匹配前一项1次或多次,等价于{1,} |
* | 匹配前一项0次或多次,等价于{0,} |
/\d{2,4}/ //匹配2到4个数字
/\w{3}\d?/ //精确匹配三个单词和一个可选的数字
/\s+java\s+/ //匹配前后带有一个或多个空格的字符串“java”
/[^(]*/ //匹配一个或多个非左括号的字符
非贪婪的重复
表10-3中列出的匹配重复字符串是尽可能多地匹配,而且允许后续的正则表达式继续匹配。因此,我们称之为“贪婪的”匹配。
可以使用正则表达式进行非贪婪匹配。只须在待匹配的字符后跟随一个问号即可:“??”、“+?”、“*?”或“{1,5}”。
10.1.4 选择、分组和引用
表10-4:正则表达式的选择、分组和引用字符字符 | 含义 |
| | 选择,匹配的是该符号左边的子表达式或右边的子表达式 |
(...) | 组合,将几个項组合为一个单元,这个单元可通过“”、“”、“”和“”等符号加以修饰,而且可以记住和这个组合相匹配的字符串已供此后的引用使用 |
(?:...) | 只组合,把项组合到一个单元,但不记忆与该组相匹配的字符 |
\n | 和第n个分组第一次匹配的字符相匹配,组是圆括号中的子表达式(也有可能是嵌套的),组索引是从左到右的左括号数,“?:”形式的分组不编码 |
10.1.5 指定匹配位置
表10-5:正则表达式中的锚字符字符 | 含义 |
^ | 匹配字符串的开头,在多行检索中,匹配一行的开头 |
$ | 匹配字符串的结尾,在多行检索中,匹配一行的结尾 |
\b | 匹配一个单词的边界,简言之,就是位于字符\w和\W之间的位置,或位于字符\w和字符串的开头或者结尾之间的位置 |
\B | 匹配非单词边界的位置 |
(?=p) | 零宽正向先行断言,要求接下来的字符都与p匹配,但不能包括匹配p的那些字符 |
(?!p) | 零宽负向先行断言,要求接下来的字符不与p匹配 |
10.1.6 修饰符
字符 | 含义 |
i | 执行不区分大小写的匹配 |
g | 执行一个全局匹配,简言之,即找到所有的匹配,而不是在找到第一个之后就停止 |
m | 多行匹配模式,^匹配一行的开头和字符串的开头,$匹配行的结束和字符串的结束 |
相关文章推荐
- 矩阵快速幂
- 数据结构之顺序栈
- TCP/IP 协议 建立与链接
- Android应用Preference相关及源码浅析(Preference组件家族篇)
- UI:UITableView表视图
- Makefile经典教程(掌握这些足够)
- android 自定义ScrollView控件上拉和下拉有拉伸效果
- turtlebot PC ros network setup
- html页面
- zTree异步加载otherParam定义的静态参数(非写死的值)不起作用
- 链表翻转的递归和非递归实现
- 浅议核方法
- SQLite3 写数据库时的锁机制
- 万年历(C语言代码实现)
- 有人对我说"白菜也会孤独吗?",“你懂我吗?朋友!”
- redis的学习地址
- Linux学习之文件系统管理
- 读书笔记之深入理解操作系统(10)
- CodeForces 337A - Puzzles
- (转)简明 Vim 练级攻略