JavaScript 正则表达式

本文详细介绍了JavaScript中的正则表达式,包括RegExp对象的创建、直接量字符的匹配、字符类的使用、重复字符的语法以及在实际案例中的应用,如用户名表单验证。

1、说明

      JavaScript中的正则表达式用RegExp对象表示,可以使用RegExp()构造函数来创建RegExp对象,不过RegExp对象更多的是通过一种特殊的直接量语法来创建,就想通过引号包裹字符的方式来定义字符串直接量一样,正则表达式直接量定义为包含在一对斜杠 (/) 之间的字符,例如:
在这里插入图片描述

      运行这段代码创建一个新的RegExp对象,并将它赋值给变量pattern。这个特殊的 RegExp 对象用来匹配所有以字母"s"结尾的字符串。用构造函数 RegExp() 也可以定义一个与之等价的正则表达式,代码如下:
在这里插入图片描述

RegExp 直接量和对象的创建

就像字符串和数字一样,程序中每个取值相同的原始类型直接量均表示相同的值,就是显而易见的。程序运行时每次遇到对象直接量(初始化表达式)诸如 {} 和 [] 的时候都会创建新对象。比如,如果在循环体中写 var a = [] ,则每次遍历都会创建一个新的空数组。

      正则表达式的模式规则是由一个字符序列组成的。包括所有字母和数字在内,大多数的字符都是按照直接量仅描述待匹配的字符的。如此说来,正则表达式 /java/ 可以匹配任何包含“java”子串的字符串。除此之外,正则表达式中还有其他具有特殊语义的字符,这些字符并不按照字面含义进行匹配。比如,正则表达式 /s$/ 包含两个字符第一个字符 “s” 按照字面含义匹配第二个字符 $ 是一个具有特殊语义的元字符,用以匹配字符串的结束。因此这个正则表达式可以匹配任何以 “s” 结束的字符串。

2、直接量字符

      正如上文提到的,正则表达式中的所有字母和数字都是按照字面含义进行匹配的。JavaScript正则表达式语法也支持非字母的字符匹配,这些字符需要通过反斜杠 () 作为前缀进行转移。比如,转移字符 \n 用以匹配换行符。

正则表达式中的直接量字符

字符匹配
字母和数字字符自身
\oNULL 字符(\u0000)
\t制表符(\u0009)
\n换行符(\u000A)
\v垂直制表符(\u000B)
\f换页符(\u000C)
\r回车符(\u000D)
\xnn由十六进制数nn指定的拉丁字符,例如,\x0A等价于\n
\uxxxx由十六进制数xxxx指定的Unicode字符,例如,\u0009等价于\t
\cX控制字符^X,例如,\cJ等价于换行符\n

在正则表达式中,许多标点符号具有特殊含义,它们是:

^ $ . * + ? = ! : | \ / ( ) [ ] { }

某些符号只有在正则表达式的某些上下文中才具有某种特殊含义,在其他上下文中则被当成直接量处理。然而,如果想在正则表达式中使用这些字符的直接量进行匹配,则必须使用前缀 \ ,这是一条通行规则。其他标点符号(比如@和引号)没有特殊含义,在正则表达式中按照字面含义进行匹配。

如果不记得哪些标点符号需要反斜线转义,可以在每个标点符号前都加上反斜线。另外需要注意,许多字母和数字在有反斜线做前缀时也有特殊含义,所以对于像按照直接量进行匹配的字母和数字,尽量不要用反斜线对其转义。当然,要想在正则表达式中按照直接量匹配反斜线本身,则必须使用反斜线将其转义。比如正则表达式 “ΛV”用以匹配任何包含反斜线的字符串。

3、字符类

      将直接量字符单独放进方括号内就做成了字符类。一个字符类可以匹配它所包含的任意字符。因此,正则表达式/[abc]/就和字母“a”、“b”、“c”中的任意一个都匹配。另外,可以通过 “^” 符号来定义否定字符类,它匹配所有不包含在方括号内的字符。定义否定字符类时,讲一个 “^” 符号作为左方括号内的第一个字符。整则表达式 /[^abc]/ 匹配的是“a”、“b”、“c”之外的所有字符。字符类可以使用连字符来表示字符范围。要匹配拉丁字母表中的小写字母,可以使用/[a-z]/,要匹配拉丁字母表中任何字母和数字,则使用/[a-zA-Z0-9]/。

正则表达式的字符类

字符匹配
[…]方括号内的任意字符
[^…]不在方括号内的任意字符
.除换行符和其他Unicode行终止符之外的任意字符
\w任何ASCⅡ字符组成的单词,等价于[a-zA-Z0-9]
\W任何不适ASCⅡ字符组成的单词,等价于[^a-zA-Z0-9]
\s任何Unicode空白符
\S任何非Unicode空白符的字符,注意\w和\S不同
\d任何ASCⅡ数字,等价于[0-9]
\D除了ASCⅡ数字之外的任何字符,等价于[^0-9]
[\b]退出直接量(特例)

ASCⅡ (American Standard Code for Information Interchange,美国信息互换标准代码,ASCⅡ)是基于拉丁*字母*的一套电脑编码系统。

注意:

在方括号之内可以写这些特殊转移字符。比如,由于\s匹配所有的空白字符,\d匹配的是所有数字,因此/[\s\d]/就匹配任意空白符或者数字。注意,这里有个特例,下面我们将会看到转义符\b具有的特殊含义,当用再字符类中时,它表示的是退格符,所以要在正则表达式中按照直接量表示一个退格符,只需要使用有一个元素的字符类/[\b]

4、重复

      我们在正则模式之后跟随用以指定字符重复的标记。由于某些重复种类非常常用,因此就有一些专门用于表示这种情况的特殊字符。

正则表达式中的重复字符语法

字符含义
{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”

/[^(]*/                  // 匹配一个或多个非左括号的字符

在使用 “+” 和 “?” 时要注意,由于这些字符可能匹配0个字符,因此它们允许什么都不匹配。

正则表达式的选择、分组和引用字符

字符含义
|选择匹配的是该符号左边的子表达式或右边的子表达式
(…)组合,讲几个项组合为一个单元,这个单元可通过“*”、“+”、“?”和“|”等符号加以修饰,而且可以记住和这个组合相匹配的字符串以供伺候的引用使用
(?:…)只组合,把项目组合到一个单元,但不记忆与该组相匹配的字符
\n和第n个分组第一次匹配的字符相匹配,组是圆括号中的子表达式(也有可能是嵌套的),组索引号是从左到右的左括号数,“(?:”形式的分组不编码

正则表达式中的锚字符

字符含义
^匹配字符串的开头,在多行检索中,匹配一行的开头
$匹配字符串的结尾,在多行检索中,匹配一行的结尾
\b匹配一个单词的边界,简言之,就是位于字符\w和\W之间的位置,或位于字符\w和字符串的开头或者结尾之间的位置(但需要注意,[\b]匹配的是退格符)
\B匹配非单词边界的位置
(?=p)零宽正想先行断言,要求接下来的字符都与p匹配,单不能包括匹配p的那些字符
(?!p)零宽正想先行断言,要求接下来的字符都与p匹配

5、案例+效果

- 用户名表单验证

功能:

  1. 如果用户名输入合法, 则后面提示信息为: 用户名合法,并且颜色为绿色
  2. 如果用户名输入不合法, 则后面提示信息为: 用户名不符合规范, 并且颜色为红色

代码:
在这里插入图片描述

效果:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值