ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
字符类(class)表示有一系列字符可供选择,只要匹配其中一个就可以了。所有可供选择的字符都放在方括号内,比如`[xyz]`表示`x`、`y`、`z`之中任选一个匹配。 ~~~ /[abc]/.test('hello world') // false /[abc]/.test('apple') // true ~~~ 上面代码中,字符串`hello world`不包含`a`、`b`、`c`这三个字母中的任一个,所以返回`false`;字符串`apple`包含字母`a`,所以返回`true`。 有两个字符在字符类中有特殊含义。 **(1)脱字符(^)** 如果方括号内的第一个字符是`[^]`,则表示除了字符类之中的字符,其他字符都可以匹配。比如,`[^xyz]`表示除了`x`、`y`、`z`之外都可以匹配。 ~~~ /[^abc]/.test('bbc news') // true /[^abc]/.test('bbc') // false ~~~ 上面代码中,字符串`bbc news`包含`a`、`b`、`c`以外的其他字符,所以返回`true`;字符串`bbc`不包含`a`、`b`、`c`以外的其他字符,所以返回`false`。 如果方括号内没有其他字符,即只有`[^]`,就表示匹配一切字符,其中包括换行符。相比之下,点号作为元字符(`.`)是不包括换行符的。 ~~~ var s = 'Please yes\nmake my day!'; s.match(/yes.*day/) // null s.match(/yes[^]*day/) // [ 'yes\nmake my day'] ~~~ 上面代码中,字符串`s`含有一个换行符,点号不包括换行符,所以第一个正则表达式匹配失败;第二个正则表达式`[^]`包含一切字符,所以匹配成功。 > 注意,脱字符只有在字符类的第一个位置才有特殊含义,否则就是字面含义。 **(2)连字符(-)** 某些情况下,对于连续序列的字符,连字符(`-`)用来提供简写形式,表示字符的连续范围。比如,`[abc]`可以写成`[a-c]`,`[0123456789]`可以写成`[0-9]`,同理`[A-Z]`表示26个大写字母。 ~~~ /a-z/.test('b') // false /[a-z]/.test('b') // true ~~~ 上面代码中,当连字号(dash)不出现在方括号之中,就不具备简写的作用,只代表字面的含义,所以不匹配字符`b`。只有当连字号用在方括号之中,才表示连续的字符序列。 以下都是合法的字符类简写形式。 ~~~ [0-9.,] [0-9a-fA-F] [a-zA-Z0-9-] [1-31] ~~~ 上面代码中最后一个字符类`[1-31]`,不代表`1`到`31`,只代表`1`到`3`。 连字符还可以用来指定 Unicode 字符的范围。 ~~~ var str = "\u0130\u0131\u0132"; /[\u0128-\uFFFF]/.test(str) // true ~~~ 上面代码中,`\u0128-\uFFFF`表示匹配码点在`0128`到`FFFF`之间的所有字符。 另外,不要过分使用连字符,设定一个很大的范围,否则很可能选中意料之外的字符。最典型的例子就是`[A-z]`,表面上它是选中从大写的`A`到小写的`z`之间52个字母,但是由于在 ASCII 编码之中,大写字母与小写字母之间还有其他字符,结果就会出现意料之外的结果。 ~~~ /[A-z]/.test('\\') // true ~~~ 上面代码中,由于反斜杠('\\')的ASCII码在大写字母与小写字母之间,结果会被选中。