字符类

字符类区分不同种类的字符,例如,区分字母和数字。

试一试

const chessStory = "He played the King in a8 and she moved her Queen in c2.";
const regexpCoordinates = /\w\d/g;
console.log(chessStory.match(regexpCoordinates));
// Expected output: Array [ 'a8', 'c2']

const moods = "happy 🙂, confused 😕, sad 😢";
const regexpEmoticons = /[\u{1F600}-\u{1F64F}]/gu;
console.log(moods.match(regexpEmoticons));
// Expected output: Array ['🙂', '😕', '😢']

类型

字符 含义
[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"。

unicodeSetsv)标志启用时,字符类有一些额外的功能。有关更多信息,请参阅字符类参考。

[^xyz]
[^a-c]

否定字符类:匹配方括号中未包含的任何字符。你可以使用连字符指定一个字符范围,但如果连字符出现在 ^ 之后的第一个字符或方括号中包含的最后一个字符,它将被视为一个字面连字符,作为普通字符包含在字符类中。例如,[^abc][^a-c] 相同。它们最初匹配 "bacon" 中的 "o" 和 "chop" 中的 "h"。

注意: ^ 字符也可能表示输入的开始

.

通配符:匹配除行终止符(\n\r\u2028\u2029)之外的任何单个字符。例如,/.y/ 匹配 "yes make my day" 中的 "my" 和 "ay",但不匹配 "yes",因为 "yes" 中 "y" 前面没有字符。如果 dotAll (s) 标志启用,也匹配行终止符。在字符类内部,点号失去其特殊含义,匹配一个字面点号。

\d

数字字符类转义:匹配任何数字(阿拉伯数字)。等同于 [0-9]。例如,/\d//[0-9]/ 匹配 "B2 is 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\u0020\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]。例如,/\s\w*/ 匹配 "foo bar" 中的 " bar"。

\S

非空白字符类转义:匹配除空白字符之外的单个字符。等同于 [^\f\n\r\t\v\u0020\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+001A)。例如,/\cM\cJ/ 匹配 "\r\n"。

\xhh 匹配代码为 hh(两个十六进制数字)的字符。
\uhhhh 匹配值为 hhhh(四个十六进制数字)的 UTF-16 代码单元。
\u{hhhh}\u{hhhhh} (仅当设置了 u 标志时。)匹配 Unicode 值为 U+hhhhU+hhhhh(十六进制数字)的字符。
\p{UnicodeProperty}, \P{UnicodeProperty}

Unicode 字符类转义:根据其 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)

示例

查找一系列数字

在这个例子中,我们用 \d{4} 匹配一个由 4 个数字组成的序列。\b 表示一个单词边界(即,不要在数字序列的中间开始或结束匹配)。

js
const randomData = "015 354 8787 687351 3512 8735";
const regexpFourDigits = /\b\d{4}\b/g;

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

字符类转义参考中查看更多示例。

查找以 A 开头(拉丁字母)的单词

在这个例子中,我们匹配一个以字母 A 开头的单词。\b 表示一个单词边界(即,不要在单词中间开始匹配)。[aA] 表示字母 "a" 或 "A"。\w+ 表示拉丁字母表中的任何字符,多次出现(+ 是一个量词)。请注意,由于我们已经匹配到不再有单词字符为止,因此不需要结尾的 \b 边界。

js
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;

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

字符类转义参考中查看更多示例。

查找单词(来自 Unicode 字符)

我们可以使用一系列 Unicode 字符而不是拉丁字母表来识别单词(从而能够处理俄语或阿拉伯语等其他语言的文本)。Unicode 的“基本多语言平面”包含世界上使用的大多数字符,我们可以使用字符类和范围来匹配用这些字符编写的单词。

js
const nonEnglishText = "Приключения Алисы в Стране чудес";
const regexpBMPWord = /([\u0000-\u0019\u0021-\uFFFF])+/gu;
// BMP goes through U+0000 to U+FFFF but space is U+0020

console.table(nonEnglishText.match(regexpBMPWord));
["Приключения", "Алисы", "в", "Стране", "чудес"];

Unicode 字符类转义参考中查看更多示例。

计算元音

在这个例子中,我们计算文本中的元音(A、E、I、O、U、Y)数量。g 标志用于匹配文本中所有出现的模式。i 标志用于使模式不区分大小写,因此它匹配大写和小写元音。

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

console.log("Number of vowels:", aliceExcerpt.match(regexpVowels).length);
// Number of vowels: 26

另见