本文系统整理 JavaScript 中正则表达式(RegExp)的核心用法,涵盖两种定义方式、特殊字符与量词的含义,以及 test、exec、replace 等对象方法的实际应用。重点解析动态生成正则时特殊字符的转义处理,帮助开发者掌握字符串匹配与替换的高效技巧。
正则表达式概述与定义方式
近期在学习 JavaScript 过程中,接触到正则表达式(Regular Expression)相关知识点较为分散,特此整理成文以便总结回顾。
定义
在 JavaScript 中,创建正则表达式主要有两种途径:
1)使用构造函数:var exp1 = new RegExp("abc");
2)使用字面量语法:var exp2 = /abc/; // 注意此处无需双引号,若添加双引号则变为字符串类型
特殊字符与记忆技巧
特殊字符
其特殊字符集与 Perl 语言基本一致,可直接沿用。
\d 匹配数字字符
\w 匹配字母、数字或下划线(即单词字符)
\s 匹配空白字符(包括空格、制表符、换行符等)
\D 匹配非数字字符
\W 匹配非字母数字字符
\S 匹配非空白字符
. 匹配除换行符以外的任意字符
这里提供一种简便的记忆方式:
小写 d 代表 digit(数字),因此匹配数字
小写 w 代表 word(单词),因此匹配字母或数字
小写 s 代表 space(空格),因此匹配空白字符
所有大写字母均表示反向匹配(即不匹配原义字符)。
方括号与圆括号的匹配规则
方括号 []
在方括号内放置模式,表示只要匹配其中任意一个字符即判定为真(这与 Java 或 Perl 的行为一致)。
例如:
代码如下:
console.log(/[01]/.test("023424")); // true
console.log(/[01]/.test("13424")); // true
console.log(/[01]/.test("23424")); // false 圆括号()
表示必须完全符合括号内的模式才会判定为真。
例如:
代码如下:
console.log(/[01]/.test("013424")); // true
console.log(/[01]/.test("13424")); // false
console.log(/[01]/.test("230424")); // false
console.log(/[01]/.test("230142401")); // true 量词与正则对象方法详解
量词(Quantifiers)
与 Java 中的行为完全一致。以下表格非常实用,也是个人常用参考:
| Greedy | Reluctant | Possessive | Meaning |
|---|---|---|---|
| X? | X?? | X?+ | X, once or not at all |
| X* | X*? | X*+ | X, zero or more times |
| X+ | X+? | X++ | X, one or more times |
| X{n} | X{n}? | X{n}+ | X, exactly n times |
| X{n,} | X{n,}? | X{n,}+ | X, at least n times |
| X{n,m} | X{n,m}? | X{n,m}+ | X, at least n but not more thanm times |
正则表达式对象方法
1) test:该方法接收一个字符串作为参数,返回布尔值 true 或 false,分别表示是否匹配成功。
2) exec:若未找到匹配项,返回 null;若找到匹配项,则返回一个数组,其中包含按顺序匹配的字符串信息。
3) String.replace(expression1, string1):该方法将正则表达式匹配到的部分替换为指定的字符串 string1。在 string1 中,可以使用正则表达式中定义的分组(parenthesized group)进行引用。
例如:"co-ol".replace(/[\w]+\-[\w]+/,"$2-$1"); // 结果为 "ol-co"。此功能支持引用至 $9。
4) String.replace(expression, function):这是更强大的增强版方法,允许通过自定义函数来定义输出结果。具体用法此处不再赘述,请参考相关文档。
点击打开链接
动态生成正则表达式及特殊字符转义
动态生成正则表达式
当正则表达式的内容仅在运行时才能确定时,此方法尤为适用。
生成正则表达式本质上只需构建好字符串形式的正则表达式,再通过 RegExp 构造函数即可创建。(这在文章开头已提及)。
例如:
代码如下:
var name = "dear"
"oh, my dear".replace(new RegExp(name), "god"); // 结果为 oh, my god 然而,如果字符串中包含特殊字符,直接上述方法可能会导致正则表达式解析错误。
因此,在这种情况下,我们需要在输入字符串的每个字符前添加反斜杠进行转义,例如:
代码如下:
var name = df[]vxv;
var expName = name.replace("/[^/w/s]/g","\\$&");
"my name is df[]vxv".replace(new RegExp(name), "Bob"); // 结果为 my name is Bob