字符类

字符类区分字符类型,例如,区分字母和数字。

试试看

类型

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

unicodeSets (v) 标志启用时,字符类将具有一些其他功能。有关更多信息,请参阅 字符类 参考。

[^xyz]
[^a-c]

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

注意: ^ 字符也可能指示 输入的开头

.

通配符: 匹配除行终止符之外的任何单个字符:\n\r\u2028\u2029。例如,/.y/ 匹配 "my" 和 "ay",但不匹配 "yes",在 "yes make my day" 中,因为 "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 字符属性匹配字符:例如,表情符号字符,或日语平假名字符,或中日韩汉/ kanji 字符,等等。

\

表示以下字符应被特殊对待或“转义”。它有两种行为之一。

  • 对于通常按字面意义处理的字符,表示下一个字符是特殊的,不应按字面意义解释。例如,/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

另请参阅