正则表达式字符类

 

假设有这样一个电话号码:+7(903)-123-45-67,现在需要把它转换成一个纯数字:79031234567

那首先需要找到并且移除非数字的字符。字符类(Character classes)就可以派上用场了。

character class 是一个特殊的符号,用来匹配某个特定的字符。

\d 用来匹配任意一个数字,例如找到电话中的第一个数字:

let str = "+7(903)-123-45-67";

let regexp = /\d/;

alert( str.match(regexp) ); // 7

在没有 g 符号的情况下,上面的正则表达式只会找第一个符合条件的字符,即 \d

添加 g 符号即可找到所有数字:

let str = "+7(903)-123-45-67";

let regexp = /\d/g;

alert( str.match(regexp) ); // 7,9,0,3,1,2,3,4,5,6,7

alert( str.match(regexp).join('') ); // 79031234567

\d 即代表匹配任意一个数字。

一些经常用的符号类:

\d:d 即 digit,匹配 0-9 任意一个数字

\s:s 即 space,匹配空格字符,如:制表符 \t, 换行符 \n,和其他几个不常用的字符:\v\f\r

\w:w 即 word,匹配任意一个拉丁字符、数字、下划线,不会匹配非拉丁字符。

例如,\d\s\w 表示一个数字后面是一个空格,空格后面是一个字符,例如:1 a

一个正则表达式中可以同时包含字符和字符类

例如:CSS\d 表示 CSS 后面跟随任意一个数字:

let str = "Is there CSS4?";
let regexp = /CSS\d/

alert( str.match(regexp) ); // CSS4

同样可以使用多个字符类:

alert( "I love HTML5!".match(/\s\w\w\w\w\d/) ); // ' HTML5'
// \s = 空格
// 第一个 \w = H
// 第二个 \w = T
// ... 以此类推
// \d = 5

相反的符号类:

每一个符号类都存在一个与之相反的符号类,但是是大写的形式。

每一个相反的符号类表示匹配与它相反的字符,例如:

\D 表示非数字的字符

\S 表示非空格字符

\W 表示非字符的字符,例如:空格或者是非拉丁字符

最上面的电话号码例子同样可以用字符类来实现:

let str = "+7(903)-123-45-67";

alert( str.replace(/\D/g, "") ); // 79031234567

一个点代表任意字符

点是一个特殊的符号类,它会匹配任意字符,除了换行符。

例如:

alert( "Z".match(/./) ); // Z

或者在正则表达式中间:

let regexp = /CS.4/;

alert( "CSS4".match(regexp) ); // CSS4
alert( "CS-4".match(regexp) ); // CS-4
alert( "CS 4".match(regexp) ); // CS 4 (空格同样是一个字符)

注意:一个点代表任意一个字符,但不是说没有字符:

alert( "CS4".match(/CS.4/) ); // null

代表任意字符的 .s 符号

默认情况下,点不会匹配到换行符 \n

例如,表达式 A.B 代表先找到 A,然后任意一个字符(不包括换行符),然后再是 B。

alert( "A\nB".match(/A.B/) ); // null (no match)

但是有时我们想要【点】符号匹配到任意一个字符,包括换行符。

s 符号可以解决这种情况:

alert( "A\nB".match(/A.B/s) ); // A\nB (match!)

s 符号在 IE 浏览器中不兼容

幸运的是有 “hack” 的方法:

我们可以使用 [\s\S] 去匹配任意字符:

alert( "A\nB".match(/A[\s\S]B/) ); // A\nB (match!)

[\s\S] 即代表:一个字符或者不是一个字符,即任意一个字符。

我们也可以使用其他字符类,它们作用是相同的。例如:[\d\D],甚至是 [^]- 即代表任意一个字符,除非没有字符。

我们同样可以利用这个 trick 来做【点】字符不能做到的事情,即匹配任意字符,包括换行符。

注意空格符号

通常对于我们来说 1-51 - 5是一样的。

但是如果在写正则表达式时没有考虑到这种情况,表达式不会匹配到任何内容。

例如:找到某些通过连字符 - 链接的数字:

alert( "1 - 5".match(/\d-\d/) ); // null, no match!

所以需要考虑空格的情况:

alert( "1 - 5".match(/\d - \d/) ); // 1 - 5, now it works
// or we can use \s class:
alert( "1 - 5".match(/\d\s-\s\d/) ); // 1 - 5, also works

空格同样是一个字符,和其他字符一样是同等的。

总结

内置的字符类:

  • \d 任意一个数字
  • \D\d
  • \s 任意空格
  • \S\S
  • \w 任意拉丁字符、数字、下划线
  • \W\w
  • . 在和 s 符号一起使用的情况下,匹配任意字符包括换行符;否则不包括换行符

and more…

Reference:

https://javascript.info/regexp-character-classes