JavaScript 正则表达式 重复 转义 字符类详解

作者:袖梨 2022-11-14

正则表达式的重复字符:
字符 含义
{n,m} 匹配前一项至少n次,但是不能超过m次
{n,} 匹配前一项n次,或更多次
{n} 匹配前一项恰好n次
? 匹配前一项0次或1次,也就是说前一项是可选的。相当于{0,1}
+ 匹配前一项1次或多次,相当于{1,}
* 匹配前一项0次或多次,相当于{0,}
示例:

代码如下 复制代码

//所有十位数,到四位数,包括:0000
var pattern = /d{2,4}/;

//如下正则内容匹配ab,abc,abcccc
var pattern = /abc*/;

//如下正则内容匹配ab,abbb
var pattern = /ab+/;

注意:在使用重复字符*和?时都要小心,由于 这些字符可能匹配前面字符的0个匹配,所以它们允许什么都不匹配。比如说正则表达式/a*/实际上还与bbbb也是匹配的,因为这个字符里含有0个字母a。
非贪婪的重复:
刚才我介绍的一些重复出神入化都会匹配尽可能多的字符,而且允许接下来的正则表达式继续匹配。因为说上述的重复是“贪婪”的。在JavaScript的正则表达式中,可以以非贪婪的方式进行重复,这本来是Perl5的一个特性,不过被JavaScript给实现了。
定义非贪婪的重复方法:只需要在重复字符后面加问号即可,例如:?? , ?+ , ?*甚至{1,5}?这也是可以的。
举例如下:
正常情况下/a+/匹配一个或多个字符a,将其应用到字符aaa上时,它与三个字母都匹配。但是/a+?/只匹配一个或多个必要的字
母a
例如/a*b/匹配的是一个或多个字母a后面加上一个字母b,其即匹配b,aaab,ab也匹配aab,但是如果将其改为非贪婪的重复时,即/a*b?/它则只匹配b,而不匹配ab,与aaab了。


字符类————用枚举定义聚集:
刚才给大家的例子中已经说明了,字符类定义的其实是一个聚集枚举。字符类与其包含的任何字符都匹配。大家看我上面给的例子就可以看出,不??铝恕?br /> 为何用字符类:
JavaScript 的正则表达式是支持布尔操作的,我们如果想匹配字母”a”,”b”或者”c”时可以通过之前提到过的正则表达式直接量来用布尔的形式定义,示例如下:
//为了说明正则表达式支持布尔型操作

代码如下 复制代码
var pattern = /a|b|c/;

之所以用字符类,是因为当要匹配的成员很多时,用字符类显然会比用布尔操作简单的多。
字符类————支持范围定义:
字符类除了枚举定义聚集外,还支持范围定义,其语法结构为:/[begin_data-end_data]/,示例如下:
//定义正则表达式匹配0-9

代码如下 复制代码
var pattern = /[0-9]/;

//定义正则表达式匹配数字0-9及字母a-z
var pattern = /[0-9a-z]/;字符类————支持布尔非操作:
呃, 什么叫布尔非呢?就是布尔型里面的取反操作,也就是非嘛。。您说正,那么我就想要负的,您说大于我就说小于等于。就是这么个道理。字符类也支持布尔的非操作,只需要在括号中字符集的前面加符号”^”即可。
//匹配除字母a,b,c之外的任何一个字符

代码如下 复制代码
var pattern = /[^abc]/;

JavaScript 字符类缩写:
字符类缩写这个名字是我起的,呵呵。因为上述所说一些观点,大家也可以看出来了,字符类是相当的好用。为此,JavaScript的正则表达式语法就包含了一些特殊字符和转义序列来表示这些常用的类(大多数编程语言现在大都支持此类操作),使您可以很方便的使用。下面我把书中列出的字符类缩写来给大家列出来,方便阅读,呵。不过需要注意一下,有些字符类转义序列只匹配ASCII字符,还没有扩展到可以处理Unicode字符,可以显示地定义自己的Unicode字符类。
字符 匹配
[...] 位于括号之内的任意字符
[^...] 不丰括号之中的任意字符
. 除换行符和其他Unicode行终止符之外的任意字符
w 任何ASCII单字字符,等价于[a-zA-Z0-9_]即,数字、字母、下划线
W 任何ASCII非单字字符,等价于[^a-zA-Z0-9_]
s 任何Unicode空白符
S 任何非Unicode空白符,注意w和S不同
d 任何ASCII数字,等价于[0-9]
D 除了ASCII数字之外的任何字符,等价于[^0-9]
[b] 退格直接量(特例)


字符的转义规则:
字符 匹配
字母数字字符 自身
o NULL字符(u0000)
t 制表符(u0009)
n 换行符(u000A)
v 垂直制表符(u000B)
f 换页符(u000C)
r 回车(u000D)
xnn 由十六进制数 nn 指定的拉丁字符,例如,x0A 等价于 n
uxxxx 由十六进制数xxxx指定的Unicode字符,例如,u0009等价于t
cX 控制字符^X。例如,cJ等价于换行符n
具有特殊含义的标点符号 :
与普通字符串不同的是正则表达式中的一些符号具有特殊含义,当它们作为普通字符使用时,必须要经过转义,它们包括:
^ $ . * + ? = ! : | / () [] {}
这些特殊的标点符号会在后续的日志里面加以讲解。

相关文章

精彩推荐