详细

【JS系列8】javascript 正则表达式

1.创建

1-1 方式

  • 字面量 var 变量名 = /表达式/模式修饰符
  • 构造函数 var 变量名 = new RegExp(“表达式”,“模式修饰符”)

1-2 表达式

Terminal window
* 单个字符与数字
. 查找单个字符,除换行符和行结束符
[a-z0-9] 匹配方括号中的任意字符
[^a-z0-9]匹配不在方括号中的任意字符
\d 匹配数字
\D 匹配非数字
\w 匹配字母
\W 匹配非字母
* 空白字符
\0 匹配null字符
\f 匹配换页符
\n 匹配换行符
\r 匹配回车符
\s 匹配空白字符
\S 匹配非空白字符
\t 匹配制表符
* 定位符
^ 行首匹配
$ 行尾匹配
\A 只匹配字符串的开始处
\b 匹配单词边界,此在[]内无效
\B 匹配非单词边界
\G 匹配当前搜索的开始位置
\Z 匹配字符串结束处或行尾
\z 只匹配字符串结束处
* 限定符
x? 匹配0个或1个x
x* 匹配0个或任意多个x
x+ 匹配至少1个x
x{m,n} 匹配最少m个,最多n个x
* 分组
(?:x) 匹配x但不记录匹配结果
x(?=y) 当x后接y时匹配x
x(?!y) 当x后不是y时匹配x
* 引用 \1...\9 $1...$9 返回九个在模式匹配期间找到的、最近保存的部分
* 或模式 x|y|z 匹配x或y或z
* 模式修饰符
g全局模式,应用于所有字符串;
i执行对大小写不敏感的匹配;
m多行匹配模式

2. 属性

2-1 实例属性

  • global 检测是否设置g标记
  • ignoreCase 检测是否设置了i标记
  • multiline 检测是否设置了m标记
  • source 返回正则表达式的字符串表示
  • lastIndex 返回被查找字符串中下一次成功匹配的开始位置

2-2 构造函数属性

Terminal window
* s\_ input 返回最近一次匹配的字符串
* $& lastMatch 返回最近一次的匹配项
* $+ lastParen 返回最近一次匹配的捕获组
* $\` leftContext 返回被查找的字符串中从字符串开始位置到最后匹配之前的位置之间的字符
* $' rightContext 返回被搜索的字符串中从最后一个匹配位置开始到字符串结尾之间的字符
* $\* multiline 检测表达式是否采用多行模式匹配m

3. 方法

3-1 实例方法

  • exec
Terminal window
功能:在字符串中执行匹配检索,返回结果数组
参数:要应用模式匹配的字符串
特性:使用全局标记g 持续查找所有匹配项并返回
不使用全局标记g 始终返回第一个匹配项信息
执行过程:
检索字符串参数,获取正则表达式匹配文本
找到匹配文本则返回一个数组:
第0个元素——与整个模式匹配的字符串
其它元素——与捕获组匹配的字符串
否则返回null
派生属性:
index 匹配项在字符串中的位置
input 应用正则表达式的字符串
length 返回数组元素的个数
  • test
Terminal window
功能:在字符串中测试模式匹配,返回true或false

3-2 字符串方法

  • match 找到一个或多个正则表达式的匹配
  • replace 替换与正则表达式匹配的子串
  • search 检索与正则表达式相匹配的值
  • split 把字符串分割为字符串数组

注意:贪婪匹配 需要特别指出的是,正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符。举例如下,匹配出数字后面的0;

var re = /^(\d+)(0*)$/;
re.exec('102300'); // ['102300', '102300', '']

由于\d+采用贪婪匹配,直接把后面的0全部匹配了,结果0*只能匹配空字符串了。

必须让\d+采用非贪婪匹配(也就是尽可能少匹配),才能把后面的0匹配出来,加个?就可以让\d+采用非贪婪匹配:

var re = /^(\d+?)(0*)$/;
re.exec('102300'); // ['102300', '1023', '00']

4. 总结

// 元字符 . | ^ $ \w \s \d \b
// 反义字符 [^xyz] \W \S \D \B
// 转义字符 \r \n
// 贪婪&惰性 ? * + {n} {n,} {n,m} 惰性?
// 分组 (exp1) (?:exp1) 前瞻断言 zhang(?=san) zhang(?!san) 后瞻断言 (?<=zhang)san (?<!zhang)san
// 修饰符 img