字符类

字符类可以区分各种字符,例如区分字母和数字。

尝试一下

类型

字符 含义
[xyz]
[a-c]

一个字符类。匹配包含在方括号中的任何字符。你可以使用连字符指定字符范围,但如果连字符出现在方括号中的第一个或最后一个字符,则将其视为字面连字符,作为普通字符包含在字符类中。

例如,[abcd][a-d] 相同。它们匹配“brisket”中的“b”和“chop”中的“c”。

例如,[abcd-][-abcd] 匹配“brisket”中的“b”、“chop”中的“c”和“non-profit”中的“-”(连字符)。

例如,[\w-][A-Za-z0-9_-] 相同。它们都匹配“brisket”中的“b”、“chop”中的“c”和“non-profit”中的“n”。

[^xyz]
[^a-c]

一个否定或补充的字符类。也就是说,它匹配未包含在方括号中的任何字符。你可以使用连字符指定字符范围,但如果连字符出现在^后的第一个字符或方括号中的或最后一个字符,则将其视为字面连字符,作为普通字符包含在字符类中。例如,[^abc][^a-c] 相同。它们首先匹配“bacon”中的“o”和“chop”中的“h”。

备注: ^ 字符也可以表示输入的开始

.

有下列含义之一:

  • 匹配除行终止符之外的任何单个字符:\n, \r, \u2028 or \u2029. 例如,/.y/ 在“yes make my day”中匹配“my”和“ay”,而不是“yes”。
  • 在字符集内,点失去了它的特殊意义,并与文字点匹配。

需要注意的是,m multiline 标志不会改变点的行为。因此,要跨多行匹配一个模式,可以使用字符集[^]—它将匹配任何字符,包括新行。

ES2018 添加了 s“dotAll”标志,它允许点也匹配行终止符。

\d

匹配任何数字 (阿拉伯数字)。相当于 [0-9]。例如,/\d//[0-9]/ 匹配“B2is the suite number”中的“2”。

\D

匹配任何非数字 (阿拉伯数字) 的字符。相当于[^0-9]。例如,/\D/ 或者 /[^0-9]/ 匹配“B2 is the suite number”中的“B”。

\w

匹配基本拉丁字母中的任何字母数字字符,包括下划线。相当于 [A-Za-z0-9_]。例如,/\w/ 匹配“apple”中的“a”,匹配“$5.28”中的“5”,匹配“3D”中的“3”,以及匹配“Émanuel”中的“m”。

\W

匹配任何不是来自基本拉丁字母的单词字符。相当于 [^A-Za-z0-9_]。例如,/\W/ 或者 /[^A-Za-z0-9_]/ 匹配“50%”中的“%”,以及匹配“Émanuel”中的“É”。

\s

匹配单个空白字符,包括空格、制表符、换页符、换行符和其他 Unicode 空格。相当于 [ \f\n\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]。例如,/\s\w*/ 匹配“foo bar”中的“ bar”。

\S

匹配除空格以外的单个字符。相当于 [^ \f\n\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]。例如,/\S\w*/ 匹配“foo bar”中的“foo”。

\t 匹配水平制表符。
\r 匹配回车符。
\n 匹配换行符。
\v 匹配垂直制表符。
\f 匹配换页符。
[\b] 匹配退格键。如果您正在寻找单词边界字符(\b),请参阅断言
\0 匹配一个 NUL 字符。不要在此后面加上另一个数字。
\cX

使用插入符号匹配控制字符,其中“X”是 A–Z 中的一个字母(对应于代码点 U+0001U+001F)。例如,/\cM\cJ/匹配“\r\n”。

\xhh 匹配与代码 hh(两个十六进制数字)对应的字符。
\uhhhh 匹配与值 hhhh(四个十六进制数字)对应的 UTF-16 代码单元。
\u{hhhh}\u{hhhhh} (仅当设置了 u 标志时。)匹配与 Unicode 值 U+hhhhU+hhhhh(十六进制数字)对应的字符。
\p{UnicodeProperty}\P{UnicodeProperty} 根据字符的 Unicode 字符属性匹配字符(例如,仅匹配表情符号字符、日文片假名字符、中文汉字字符或日文汉字字符等)。
\

指示应特殊处理或“转义”后面的字符。它表现为两种方式之一。

  • 对于通常按字面处理的字符,表示下一个字符是特殊的,不能按字面解释。例如,/b/ 匹配字符“b”。通过在“b”前面放置反斜杠,即使用 /\b/,字符变得特殊以表示匹配单词边界。
  • 对于通常被特殊对待的字符,表示下一个字符不是特殊的,应该按字面意思解释。例如,“*”是一个特殊字符,表示应该匹配前面的字符出现 0 次或多次;例如,/a*/ 示匹配 0 个或多个“a”。要从字面上匹配 * 需在其前面加上反斜杠;例如,/a\*/ 匹配“a*”。

备注:要从字面上匹配此字符,请将其转义。换句话说就是搜索 \ 需要使用 /\\/

x|y

析取:匹配“x”或“y”。每个由管道符 (|) 分隔的部分称为一个可选项。例如,/green|red/ 匹配“green apple”中的“green”和“red apple”中的“red”。

备注: 析取是指定“一组选择”的另一种方式,但它不是字符类。析取不是原子的——你需要使用使其成为一个更大的模式的一部分。[abc] 在功能上等同于 (?:a|b|c)

示例

寻找一系列数字

const randomData = "015 354 8787 687351 3512 8735";
const regexpFourDigits = /\b\d{4}\b/g;
// \b 表示边界(即不要在单词中间开始匹配)
// \d{4} 表示一个数字,四次
// \b 表示另一个边界(即不要在单词中间结束匹配)

console.table(randomData.match(regexpFourDigits));
// ['8787', '3512', '8735']

寻找以 A 开头的拉丁字母单词

const aliceExcerpt = "I'm sure I'm not Ada,' she said, 'for her hair goes in such long ringlets, and mine doesn't go in ringlets at all.";
const regexpWordStartingWithA = /\b[aA]\w+/g;
// \b 表示边界(即不要在单词中间开始匹配)
// [aA] 表示字母 a 或 A
// \w+ 表示任何*拉丁字母*字符,多次

console.table(aliceExcerpt.match(regexpWordStartingWithA));
// ['Ada', 'and', 'at', 'all']

寻找一个 Unicode 字符的单词

代替拉丁字母,我们可以使用一系列 Unicode 字符来识别一个单词(从而能够处理其他语言的文本,如中文、俄语或阿拉伯语)。Unicode 的“基本多文种平面(Basic Multilingual Plane)”包含世界各地使用的大部分字符,我们可以使用字符类和范围来匹配用这些字符编写的单词。

const nonEnglishText = "爱丽丝 梦游 仙境";
const regexpBMPWord = /([\u0000-\u0019\u0021-\uFFFF])+/gu;
// 基本多文种平面范围是 U+0000 到 U+FFFF 但空格是 U+0020

console.table(nonEnglishText.match(regexpBMPWord));
[ '爱丽丝', '梦游', '仙境' ]

计算元音个数

const aliceExcerpt = "There was a long silence after this, and Alice could only hear whispers now and then.";
const regexpVowels = /[AEIOUYaeiouy]/g;

console.log("元音数:", aliceExcerpt.match(regexpVowels).length);
// 元音数:26

参见