JavaScript 正则表达式
JavaScript 正则表达式 (RegExp)
Section titled “JavaScript 正则表达式 (RegExp)”正则表达式 (RegExp) 是一个描述字符序列的对象,用于在字符串中进行模式匹配。它们是强大的文本搜索和替换工具。
什么是正则表达式?
Section titled “什么是正则表达式?”正则表达式定义了一个搜索模式。这个模式可以是一个简单的单个字符,也可以是定义文本中特定结构的复杂序列。
正则表达式用于执行各种文本操作,包括:
- 搜索特定的文本模式。
- 替换匹配模式的文本。
- 验证输入(例如,电子邮件格式、密码)。
- 从字符串中提取信息。
正则表达式可以通过两种方式创建:
-
字面量表示法 (Literal Notation):
/pattern/flagsconst regexLiteral = /w3schools/i; -
构造函数 (Constructor):
new RegExp("pattern", "flags")const regexConstructor = new RegExp(“w3schools”, “i”);
示例解释 (/w3schools/i):
w3schools是要搜索的模式。i是一个标志(修饰符),使搜索不区分大小写。
当模式是常量时,通常优先选择字面量表示法以获得更好的性能。
将字符串方法与正则表达式一起使用
Section titled “将字符串方法与正则表达式一起使用”JavaScript 的 String 对象有几个与正则表达式一起使用的方法:
search(regexp): 搜索匹配项并返回第一个匹配项的索引,如果未找到则返回 -1。replace(regexp|substr, newSubstr|function): 用新子字符串或函数结果替换匹配项。match(regexp): 返回包含匹配项的数组,如果未找到匹配项则返回null。行为会随g标志而改变。matchAll(regexp)(ES2020): 返回所有匹配项的迭代器,包括捕获组。需要g标志。split(separator, limit): 将字符串拆分为子字符串数组,可以使用 RegExp 作为分隔符。
使用 String.search() 与 RegExp
Section titled “使用 String.search() 与 RegExp”const text = "Visit W3Schools online!";const pattern = /w3schools/i;const position = text.search(pattern);console.log(position); // Output: 6 (index of 'W')如果将字符串传递给 search(),它会被隐式转换为 RegExp:text.search("W3Schools")。
使用 String.replace() 与 RegExp
Section titled “使用 String.replace() 与 RegExp”const originalText = "Visit Microsoft! Microsoft is great.";const newText = originalText.replace(/microsoft/ig, "W3Schools");console.log(newText); // Output: "Visit W3Schools! W3Schools is great."// 'i' for case-insensitive, 'g' for global (replace all occurrences)你也可以使用字符串作为第一个参数进行简单替换:originalText.replace("Microsoft", "W3Schools")(只替换第一个匹配项)。
正则表达式标志(修饰符)
Section titled “正则表达式标志(修饰符)”标志改变正则表达式搜索的行为:
| 标志 | 描述 |
|---|---|
i | 忽略大小写: 执行不区分大小写的匹配。 |
g | 全局搜索: 查找所有匹配项,而不是在找到第一个匹配项后停止。 |
m | 多行模式: 锚点 ^ 和 $ 匹配行的开始/结束,而不仅仅是字符串的开始/结束。 |
s | dotall 模式 (ES2018): 允许 . 匹配换行符 (\n)。 |
u | Unicode 模式 (ES6): 启用更广泛的 Unicode 支持,包括匹配 astral 符号和正确处理模式中的 Unicode 转义序列。 |
y | 粘性模式 (ES6): 只从目标字符串的 lastIndex 位置开始匹配,并且不会尝试从任何后续位置匹配。 |
正则表达式模式
Section titled “正则表达式模式”方括号定义字符集:
| 表达式 | 描述 |
|---|---|
[abc] | 查找方括号之间的任意一个字符 (a, b, or c)。 |
[^abc] | 查找不在方括号之间的任意字符。 |
[0-9] | 查找任意数字从 0 到 9。 |
[a-z] | 查找任意小写字母从 a 到 z。 |
(x|y) | 或 (Alternation): 查找 ‘x’ 或 ‘y’。 |
元字符是具有特殊含义的字符:
| 元字符 | 描述 |
|---|---|
. | 匹配除换行符外的任意单个字符(除非使用 s 标志)。 |
\d | 查找数字。等同于 [0-9]。 |
\D | 查找非数字字符。 |
\s | 查找空白字符(空格、制表符、换行符等)。 |
\S | 查找非空白字符。 |
\w | 查找单词字符(字母数字加下划线)。等同于 [A-Za-z0-9_]。 |
\W | 查找非单词字符。 |
\b | 在单词边界处查找匹配项(单词字符与非单词字符之间的位置)。 |
\B | 在非单词边界处查找匹配项。 |
\n | 匹配换行符。 |
\t | 匹配制表符。 |
\uxxxx | 查找由十六进制数 xxxx 指定的 Unicode 字符。 |
量词定义字符、组或字符类可以出现的次数:
| 量词 | 描述 |
|---|---|
n+ | 匹配包含至少一个 n 的任意字符串。 |
n* | 匹配包含零个或多个 n 的任意字符串。 |
n? | 匹配包含零个或一个 n 的任意字符串。 |
n{X} | 匹配包含 X 个 n 的任意字符串。 |
n{X,Y} | 匹配包含介于 X 和 Y 个 n 之间的任意字符串。 |
n{X,} | 匹配包含至少 X 个 n 的任意字符串。 |
有关 RegExp 模式的全面指南,请参考 MDN Web Docs 或专门的正则表达式教程。
使用 RegExp 对象方法
Section titled “使用 RegExp 对象方法”RegExp 对象本身有用于执行匹配的方法:
test(string): 在字符串中搜索模式。如果找到匹配项则返回 true,否则返回 false。
const patternTest = /e/;const resultTest = patternTest.test("The best things in life are free!");console.log(resultTest); // trueexec(string): 在字符串中搜索指定的模式并返回包含匹配信息的数组(如果未匹配则返回 null)。如果使用了全局标志 (g),exec() 可以多次调用以查找连续的匹配项,更新 RegExp 对象的 lastIndex 属性。
const patternExec = /b(est)/;const resultExec = patternExec.exec("The best things in life are free!");console.log(resultExec);// Output: ["best", "est", index: 4, input: "The best things in life are free!", groups: undefined]// resultExec[0] is the full match, resultExec[1] is the first captured group.进阶:命名捕获组 (ES2018)
Section titled “进阶:命名捕获组 (ES2018)”现代 JavaScript 允许为捕获组命名,以提高可读性:
const datePattern = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;const match = datePattern.exec("2023-10-26");if (match && match.groups) { console.log(match.groups.year); // "2023" console.log(match.groups.month); // "10" console.log(match.groups.day); // "26"}正则表达式是一个深入且强大的主题。如需完整的参考和更多高级特性,请查阅 MDN Web Docs 上关于 JavaScript 正则表达式的文档,并探索在线 RegExp 测试工具和教程。