2 * @fileoverview Rule to flag the use of empty character classes in regular expressions
3 * @author Ian Christian Myers
8 //------------------------------------------------------------------------------
10 //------------------------------------------------------------------------------
13 * plain-English description of the following regexp:
14 * 0. `^` fix the match at the beginning of the string
15 * 1. `\/`: the `/` that begins the regexp
16 * 2. `([^\\[]|\\.|\[([^\\\]]|\\.)+\])*`: regexp contents; 0 or more of the following
17 * 2.0. `[^\\[]`: any character that's not a `\` or a `[` (anything but escape sequences and character classes)
18 * 2.1. `\\.`: an escape sequence
19 * 2.2. `\[([^\\\]]|\\.)+\]`: a character class that isn't empty
20 * 3. `\/` the `/` that ends the regexp
21 * 4. `[gimuy]*`: optional regexp flags
22 * 5. `$`: fix the match at the end of the string
24 const regex = /^\/([^\\[]|\\.|\[([^\\\]]|\\.)+\])*\/[gimuys]*$/u;
26 //------------------------------------------------------------------------------
28 //------------------------------------------------------------------------------
35 description: "disallow empty character classes in regular expressions",
36 category: "Possible Errors",
38 url: "https://eslint.org/docs/rules/no-empty-character-class"
44 unexpected: "Empty class."
49 const sourceCode = context.getSourceCode();
54 const token = sourceCode.getFirstToken(node);
56 if (token.type === "RegularExpression" && !regex.test(token.value)) {
57 context.report({ node, messageId: "unexpected" });