JavaScript 中的 RegExp 对象(正则表达式)——0609 笔记整理

一、什么是正则表达式

RegExp:是正则表达式(regular expression)的简写。
1、正则表达式是由一个字符序列形成的搜索模式
2、当你在文本中搜索数据时,你可以用搜索模式来描述你要查询的内容。
3、正则表达式可以是一个简单的字符,或一个更复杂的模式。
4、正则表达式可用于所有文本搜索文本替换的操作。
5、正则表达式的作用是用来测试文本、匹配文本的(匹配字符串中的子串或者,取出符合某个条件的子串)。

二、常用字符

正则表达式字符含义对照表

(1)非打印字符
非打印字符也可以是正则表达式的组成部分。下边是表示非打印字符的转义序列:
\cx 匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 ‘c’ 字符。
\f 匹配换页符,等价于 \x0c 和 \cL。
\n 匹配换行符,等价于 \x0a 和 \cJ。
\r 匹配回车符,等价于 \x0d 和 \cM。
\t 匹配制表符,等价于 \x09 和 \cI。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。注意 Unicode 正则表达式会匹配全角空格符。
\S 匹配任何非空白字符。等价于[ ^ \f\n\r\t\v]。

(2)特殊字符
具有特殊含义的字符,要匹配特殊字符,需要转义。
$ 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘\n’ 或 ‘\r’。要匹配 $ 字符本身,请使用 \$
( ) 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \(\)
* 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*
+ 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+
? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?
. 匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 \.
[ ] 标记一个中括号表达式的开始和结束。要匹配这些字符,请使用 \[\]
\ 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, ‘n’ 匹配字符 ‘n’。’\n’ 匹配换行符。序列 "\\" 匹配 "\",而 "\(" 则匹配 "("
^ 匹配输入字符串的开始位置,在中括号中使用表示非,匹配^ 使用 \^
{ } 标记限定符表达式的开始和结束。要匹配这些字符,请使用 \{\}
| 或。要匹配 |,请使用 \|

(3)限定符
限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。
* 匹配子表达式0次或者多次。
+ 匹配子表达式1次或者多次。
匹配子表达式0次或者1次。
{n} n代表非负整数,匹配前面的表达式n次。
{n,} n代表非负整数,匹配前面的子表达式n次或者多次。
{n,m} n,m代表非负整数,匹配前面的子表达式n次或者m次。

(4)定位符
定位符用来描述字符串或单词的边界。
^ 匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与 \n 或 \r 之后的位置匹配。
$ 匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与 \n 或 \r 之前的位置匹配。
\b 匹配一个单词边界,即字与空格间的位置。
\B 非单词边界匹配。

(5)元字符
[xyz] 字符集合。匹配所包含的任意一个字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a’。
[^xyz] 负值字符集合。匹配未包含的任意字符。例如, ‘[^abc]’ 可以匹配 “plain” 中的’p’、‘l’、‘i’、‘n’。
[a-z] 字符范围。匹配指定范围内的任意字符。例如,’[a-z]’ 可以匹配 ‘a’ 到 ‘z’ 范围内的任意小写字母字符。
[^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符。例如,’[^a-z]’ 可以匹配任何不在 ‘a’ 到 ‘z’ 范围内的任意字符。
\d 匹配一个数字字符。等价于 [0-9]。
\D 匹配一个非数字字符。等价于 [^0-9]。
\w 匹配字母、数字、下划线。等价于’[A-Za-z0-9_]’。
\W 匹配非字母、数字、下划线。等价于 ‘[^A-Za-z0-9_]’。

三、语法

/正则表达式主体/ 修饰符(可选)

举例:var egx=/^1[34578]{1}\d{9}$/ig
上例中 ^1[34578]{1}\d{9}$ 是一个正则表达式主体,ig 为修饰符。

1、正则表达式的修饰符

i 忽略大小写匹配
g 全局匹配(查找所有匹配而非在找到第一个匹配后停止)
m 多行匹配

字符串的 search() 方法和 replace() 方法都可以使用正则表达式作为参数,正则表达式使得搜索功能更加强大(可以忽略大小写匹配、全局匹配)

举例:

    var s = "abcdefgabcabABC AaaaA";
    console.log(s.search(/a/ig));
    console.log(s.replace(/a/ig, "+"));

2、正则表达式的运算符优先级

相同优先级的从左到右进行运算,不同优先级的运算先高后低。

运算符描述
\转义符
(), (?: ), (?= ), []圆括号和方括号
*, +, ?, {n}, {n,}, {n,m}限定符
^, $, \任何元字符、任何字符定位点和序列(即:位置和顺序)
竖杠替换,"或"操作

注意:字符具有高于替换运算符的优先级,使得"m|food"匹配"m"或"food"。若要匹配"mood"或"food",请使用括号创建子表达式,从而产生"(m|f)ood"。

四、正则表达式的使用

1、正则表达式的验证方式

(1)RegExp 对象验证

test() 方法用于检测一个字符串是否匹配某个模式,如果字符串中含有匹配的文本,则返回 true,否则返回 false。参数为要验证的字符串。
exec() 方法用于检索字符串中的正则表达式的匹配。该函数返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。参数为要验证的字符串。

    var aa = "aldfjsldfj(dsfasjfj3124123)";
    var reg = new RegExp(/\((\w+)\)/);
    console.log(reg.test(aa));   //返回true或false
    console.log(reg.exec(aa));   //返回一个数组,可以直接根据索引取值

(2)字符串验证

match() 方法验证,如果匹配成功,返回匹配值,如果匹配不成功,返回null。
参数为正则表达式。

    var s="abcdefg";
    var egx=/abc/;
    console.log(s.match(egx)); 

2、正则表达式的选择

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

其中 ?: 是非捕获元之一,还有两个非捕获元是 ?=?!,这两个还有更多的含义,前者为正向预查,在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串,后者为负向预查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串。(摘自菜鸟)

3、正则表达式的占位符 $1, $2…

正则表达式中,每个() 可以视为一个分组,$1, $2… 表示() 所匹配的内容,$1 表示第一个(),$2 表示第二个(),以此类推…

    var egx = /^[1-9]\d{5}(18|19|[23]\d)\d{2}(0[1-9]|(10|11|12))(([02][1-9])|(10|20|30|31))\d{3}[0-9Xx]$/ig;
    var s = "61032419990102123x";
    console.log(s.replace(egx, "$1$2$4"));  //190202

上例中$1 表示字符串中的19,$2表示01,$4表示02

4、正则表达式的反向引用 \1

对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左到右出现的顺序存储。缓冲区编号从 1 开始,最多可存储 99 个捕获的子表达式。每个缓冲区都可以使用 \n 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。

可以使用非捕获元字符 ?:、?= 或 ?! 来重写捕获,忽略对相关匹配的保存。

反向引用的最简单的、最有用的应用之一,是提供查找文本中两个相同的相邻单词的匹配项的能力。(摘自菜鸟)
例如:

    var str = "Is is the cost of of gasoline going up up up";
    console.log(str.match(/\b([a-z]+) \1\b \1\b/ig)); //["up up up"]

上例中:
(1)捕获的表达式,正如 [a-z]+ 指定的,包括一个或多个字母。正则表达式的第二部分是对以前捕获的子匹配项的引用,即,单词的第二个匹配项正好由括号表达式匹配。\1 指定第一个子匹配项。
(2)单词边界元字符 \b 确保只检测整个单词。否则,诸如 “is issued” 或 “this is” 之类的词组将不能正确地被此表达式识别。
(3)正则表达式后面的全局标记 g 指定将该表达式应用到输入字符串中能够查找到的尽可能多的匹配。
(4)表达式的结尾处的不区分大小写 i 标记指定不区分大小写。
(5)多行标记指定换行符的两边可能出现潜在的匹配。

反向引用还可以将通用资源指示符 (URI) 分解为其组件。
例如:要将下面的 URI 分解为协议(ftp、http 等等)、域地址和页/路径:

var str = "http://www.runoob.com:80/html/html-tutorial.html";
var patt1 = /(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/;
arr = str.match(patt1);
for (var i = 0; i < arr.length ; i++) {
    console.log(arr[i]);
}

以上代码控制台输出:
http://www.runoob.com:80/html/html-tutorial.html
http
www.runoob.com
:80
/html/html-tutorial.html

五、常用正则表达式对照表

正则表达式在线工具——菜鸟

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值