正则表达式

282 阅读1分钟

特殊字符

特殊字符具有特殊含义,在使用前需要转义。

特殊字符 描述
$ 匹配开始位置,如果设置了multiLine属性,也会匹配'\n'或'\r'
( 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。
* 匹配前边的子表达式零次或多次
+ 匹配前边的子表达式一次或多次
. 匹配除换行符之外的任何单字符
[ 标记一个中括号表达式的开始
? 匹配前边的子表达式零次或一次,或指明一个非贪婪限定符
\ 转义符号
^ 匹配字符串的开始位置,如果出现在中括号中,则表示不接受该字符集合
{ 标记限定符表达式的开始;
{n}匹配之前的子表达式n次
| 指明两项之前选择一个

限定符

限定符用来指定正则表达式的一个给定组件必须出现多少次才能满足匹配。

字符 描述
{n} n是一个非负整数,匹配确定的n次
{n,} 匹配至少n次
{n,m} 匹配至少n次,最多m次,注意逗号和两个数之前不能有空格
* 匹配零次或多次,等价于 {0,}
+ 匹配一次或多次,等价于 {1,}
? 匹配零次或多次,等价于 {0,1}

*、+和?限定符都是贪婪的,因为他们会尽可能多的匹配文字,只有在他们的后边加上一个?就可以实现非贪婪或最小匹配。

最先开始的匹配拥有最高的优先权

使用/a*?b/匹配aaabaab会得到aaab和aab

定位符

定位符使您能够将正则表达式定位到行首或行尾。

字符 描述
^ 匹配输入字符开始的位置,如果设置了RegExp对象的multiline属性,^还会与\n或\r之后的位置匹配。
$ 匹配输入字符结束的位置,如果设置了RegExp对象的multiline属性,$还会与\n或\r之前的位置匹配。
\b 匹配一个字边界,即字与空格之间的位置
\B 非字边界

选择

用圆括号将所有选择项括起来,相邻的选择项之间用|分隔。但用圆括号会有一个副作用,相关的匹配会被缓存,此时可用?:放在第一个选项之前来消除这种副作用。

其中?:是非捕获元之一,还有两个非捕获元是?=和?!,这两个还有更多的含义,前者为正向预查,在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串,后者为负向预查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串。(一脸懵逼,完全不懂) 还有一种说法是: '?=n' 匹配任何其后紧接指定字符串n的字符串。 '?!n' 匹配任何其后没有紧接指定字符串n的字符串。

反向引用

对一个正则表达式模式或部分模式添加圆括号将导致相关匹配被存储到一个临时缓冲区,所捕获的每个子匹配项可以通过'\n'访问,n从1开始。

可以通过非捕获元字符'?:'、'?='、'?!',来忽略相关匹配的保存。

元字符

字符 描述
[xyz] 匹配所包含的任意一个字符
[^xyz] 匹配未包含的任意字符
[a-z] 匹配a-z范围内的任意字符
\d 匹配一个数字字符,等价于[0-9]
\D 匹配一个非数字字符,等价于[^0-9]
\s 匹配任意空白字符,等价于[ \f\n\r\t\v]
\S 匹配任意非空白字符,等价于[^ \f\n\r\t\v]
\w 匹配包括下划线的任意单词字符,等价于[A-Za-z0-9_]
\W 匹配任意非单词字符,等价于[^A-Za-z0-9_]

javascript中的使用

RegExp对象

生成正则表达式的两种方式:

var re = new RegExp("\\w+");
var re = /\w+/;

使用构造函数创建正则对象时,如果需要转义字符,则要在转义字符前添加转义字符。

RegExp对象属性

属性 描述
global 判断是否使用了g修饰符
ignoreCase 判断是否设置了i修饰符
lastIndex 用于规定下次匹配的起始位置,exec和test会用到。
multiline 判断是否使用了m修饰符
source 返回正则表达式的匹配模式(文本)

RegExp对象方法

方法 描述
exec 检索字符串中指定的值,返回找到的值,并确定其位置
test 检索字符串中指定的值,返回 true 或 false。全局模式下从lastIndex处开始匹配,并且将lastIndex设置为当前匹配子串的结束位置。这样test就可以循环调用。
toString 返回正则表达式的字符串

exec是所有RegExp和String模式匹配方法中最强大的一个。

  • 非全局模式下
    exec在string中搜索匹配的文本,如果找到一个匹配项,则发挥一个匹配结果组成的数组,否则返回null。返回数组的第一个元素是匹配的文本(下标为0),接下来的数组元素的下标对应的就是正则表达式中括号的顺序,值就是括号中匹配到的值。同时返回的结果中还要一个index属性,制定匹配文本的第一个字符的位置。
  • 全局模式下
    从regexp的lastIndex属性指定的位置开始搜索,当它找到一个匹配项时,将lastIndex设置为匹配之后的第一个字符的位置。这意味着exec可以重复调用,以便循环遍历一个字符串中所有的匹配项。如果它找不到匹配项则返回null并将lastIndex置为0。如果在成功找到一个字符串的匹配项后,立刻开始搜索一个新的字符串,需要手动将lastIndex置为0

String对象方法

方法 描述
search 检索与正则表达式相匹配的值,返回第一个与之匹配的子串的起始位置,如果找不到则返回-1,不支持全局搜索。
match 找到所有正则表达式的匹配
replace 替换与正则表达式匹配的子串。
split 把字符串分割为字符串数组
  • match
  1. 非全局模式下,结果是一个数组,第一个元素是匹配的字符串,接下来的数组对应的是括号中子表达式的匹配项。
  2. 全局模式下,返回的数组是所有的匹配结果。
  3. 结果数组还有一个input属性和index属性,input就是输入的string,index是匹配的字符串的开始位置。
  • replace

第一个参数是正则表达式,第二个参数是一个字符串或自定义函数来动态计算替换字符串。使用g修饰符则替换全部,否则只替换第一个。
当第二个参数是字符串时,可以使用特殊值:

字符 替换
$n 第n个圆括号中的值
$& 子表达式匹配项
$` 匹配子串的左边文本
$' 匹配子串的右边边文本
? 美元符号
  • split
    split使用的正则表达式如果包含括号,则括号中表达式匹配的子串将包含在返回的数组中
var text = "hello <b>world</b>";
text.split(/(<[^>]*>)/); // 返回 ["hello ", "<b>", "world", "</b>", ""]

参考

RUNOOB.COM-JavaScript RegExp 对象
W3Cschool-正则表达式
JavaScript权威指南第六版 正则表达式篇及第三部分中正则表达式说明与字符串说明