百度前端技术学院是一个为大学生创办的免费的前端技术实践、分享、交流平台。由百度校园招聘组、百度校园品牌部、百度前端技术部以及多个百度的前端团队联合创办。学院组织了一批百度在职工程师,精心编写了数十个实践编码任务,将技术知识点系统有机地串联在各个充满趣味与挑战的任务中,同学们通过实际地编码练习来掌握知识,再辅以互相评价、学习笔记等方式,加深对于学习内容的理解。在过去的三年中,百度前端技术学院累积吸引了上万名同学参加,并且有数十名同学在学习后,顺利加入了百度,成为了百度的前端工程师。

正则表达式之入门 基础知识回顾

作者陈腾课程正则表达式之入门1814次浏览02017-03-16 16:53

任务九 - 正则表达式之入门

任务链接
源码仓库

相关知识点回顾

直接量字符

字符 匹配
字符和数字字符 自身
o NUL字符(u0000)
t 制表符(u0009)
n 换行符(u000A)
v 垂直制表符(u000B)
f 换页符(u000C)
r 回车符(u000D)

字符类

将直接量字符单独放进方括号([])内就组成了字符类。一个字符类可以匹配它所包含的任意字符。
字符类可以使用连字符来表示字符范围。
|字符 | 匹配|
|:-----|:-----|
|[...] | 方括号内的任意字符|
|[^...] | 不在方括号内的任意字符|
|. | 除换行符和其他Unicode行终止符之外的任意字符|
|w | 任何ASCⅡ字符组成的单词,等价于[a-zA-Z0-9]|
|W | 任何ASCⅡ字符组成的单词,等价于[^a-zA-Z0-9]|
|s | 任何Unicode空白符|
|S | 任何非Unicode空白符(注意区分wS)|
|d | 任何ASCⅡ数字,等价于[0-9]|
|D | 除了ASCⅡ数字之外的任何字符,等价于[^0-9]|
|b | 退格直接量(特例)|

注:特殊转义字符也可以组成字符类(写在方括号内),比如/[sd]/匹配任意空白符或者数字。

重复

重复字符语法
代码/语法 说明
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
非贪婪的重复

上表中列出的匹配重复字符是尽可能多地匹配,而且允许后续的正则表达式继续匹配,即“贪婪匹配”
在重复字符后跟随一个问号来进行非贪婪匹配如:+?{1,5}?
:使用/a+?b/来匹配“aaab”的匹配结果同/a+b/一样为“aaab”而不是“ab”,因为匹配过程中并没有引起回溯。

选择、分组和引用

代码/语法 说明
` ` 选择,匹配的是该符号左边的子表达式或右边的子表达式
(...) 组合,将几个项组合成一个单元,这个单元可以通过“*”、“+”、“?”和“` `”等符号加以修饰,而且可以记住和这个组合相匹配的字符串以供以后的引用使用
(?:...) 只组合,把项目组合到一个单元,但不生成引用
n 和第n个分组第一次匹配的字符相匹配,组是圆括号中的子表达式(也有可能是嵌套的),组索引是从左到右的左括号数,“(?:”形式的分组不编码

指定匹配位置

正则表达式中的锚字符
代码/语法 说明
^ 匹配字符串的开头
$ 匹配字符串的结尾
b 匹配一个单词的边界,即位于字符wW之间的位置或w和字符串开头、结尾之间的位置
B 匹配非单词边界的位置
(?=exp) 零宽正向先行断言。断言自身出现的位置的后面能匹配表达式exp。比如bw+(?=ingb),匹配以ing结尾的单词的前面部分(除了ing以外的部分)
(?!exp) 零宽负向先行断言。断言此位置的后面不能匹配表达式exp。例如:d{3}(?!d)匹配三位数字,而且这三位数字的后面不能是数字

正则表达式修饰符

代码/语法 说明
i 执行不区分大小写的匹配
g 执行全局匹配,即找到所有的匹配,而不是在找到一个之后就停止
m 多行匹配,^匹配一行的开头,$匹配行的结束

用于模式匹配的String方法

// search方法返回第一个与之匹配子串的起始位置,找不到则返回-1
// 强制转换参数为RegExp类型
// 不支持全局检索,忽略正则中的g修饰符
'JavaScript'.search(/script/i)

// 不强制正则参数
// 第二个参数可以为函数,动态计算替换字符串
'javascript'.replace(/javascript/gi, 'JavaScript')
/*
 * 重点
 * 替换字符串中可以使用"$n"取得正则中子表达式匹配的文本
 * n为正则中从左到右的索引编号
 */ 

 // 最常用match方法
 '1 plus 2 equals 3'.match(/d+/g) // ['1', '2', '3']
 // 接受唯一正则参数,如不是正则则自行调用RegExp
 // match方法返回一个数组
 // arr[0]存放的谁完整的匹配
 // arr[n]存放的是正则中第n个用圆括号括起来的表达式匹配的子串($n的内容)
 // 如果传入的参数时一个非全局的正则,则返回结果同调用正则的exec()

 // split()方法也可以接受正则参数
 '1, 2, 3, 4'.split(/s*,s*/) // ['1', '2', '3', '4']

RegExp的属性和方法

5个属性

  1. source 只读字符串,包含正则的文本
  2. global 只读布尔值,正则是否带有修饰符g
  3. ignoreCase 只读布尔值,正则是否带有修饰符i
  4. multiline 只读布尔值,正则是否带有修饰符m
  5. lastIndex 可读写的整数,如果匹配模式带有g修饰符,这个属性存放整个字符串下一次检索的开始位置

    2个方法

    ```js
    // exec() 与字符串的match方法不同的是,不管正则有没有g修饰符,exec()都会返回一样的数组,即总是返回一个匹配结果,并提供本次匹配的完整信息
    // 当调用exec()的正则带有g修饰符时,它将当前正则对象的lastIndex设置为紧挨着匹配子串的字符位置。当同一正则第二次调用exec()时,他将从lastIndex属性所指示的字符串处开始检索
    // 如果exec()没有发现任何匹配结果,它会安静lastIndex重置为0
    // 任何时候都可以将lastIndex手动重置为0
    // 以上特性使在使用正则匹配字符串过程中反复调用exec():
    var pattern = /Java/g
    var text = 'JavaScript is more fun then Java'
    var result
    while ((result = pattern.exec(text)) != null) {
    alert('Matched "' + result[0] + '"'
    • ' at position ' + result.index +
      '; next search begins at ' + pattern.lastIndex)
      }

// 第二个方法是test()
// 调用test()和调用exec()等价,当exec()的返回结果不是null时,test()返回true
var pattern = /java/i
pattern.test('JavaScript') // true
```

0条评论