假设有这样一个电话号码:+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-5
和1 - 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