JavaScript正则关键在于转义规则、边界控制和标志选择:中文匹配需覆盖全角符号;replace中$&指整个匹配,$1等指捕获组;^$需加m标志才匹配每行;RegExp构造函数中反斜杠需双写;安全校验应优先考虑业务边界而非复杂正则。

JavaScript 里写正则表达式,关键不是背语法,而是知道**什么时候该转义、什么时候不该、边界怎么控、标志怎么选**。直接上干货。
匹配中文字符却漏掉全角标点?用 /[u4e00-u9fa5]/ 不够
这个常见写法只覆盖基本汉字区,但实际文本中常混有全角逗号、句号、空格(u3000-u303f)、平假名/片假名(u3040-u309f、u30a0-u30ff)等。
更稳妥的中文(含常用全角符号)匹配可写成:
/[u4e00-u9fa5u3000-u303fu3040-u309fu30a0-u30ffuff00-uffef]/
但如果只是校验「是否含中文」,建议加
^ 和 $ 或用 .test(),避免误判空字符串或纯符号串。
replace() 中的 $1、$& 到底指什么?
这些是内置替换占位符,不是变量,不能用 ${group} 模板语法(除非用函数作为第二个参数)。
常见几个含义:
-
$&:匹配到的整个字符串 -
$1、$2:对应第一个、第二个捕获组(()内的内容) -
$`:匹配之前的部分;$':匹配之后的部分
例如:
'abc123def'.replace(/(d+)/, '[$1]')
结果是
'abc[123]def';而用 '$&' 就是 'abc[123]def' 中的 [123] 变成 [123](即原样包起来)。
为什么 /^abc$/ 在多行字符串里不生效?
因为 ^ 和 $ 默认只匹配整个字符串的开头和结尾,不是每行。
要让它对换行符也生效,必须加 m(multiline)标志:
/^abc$/m.test('xxx
abc
yyy')此时会返回
true。注意:
m 不影响 . 是否匹配换行符(那是 s 标志的事),也别和 g 混用后忘记重置 lastIndex——尤其在循环中反复调用 exec() 时容易出错。
构造函数创建正则时,字符串转义要翻倍
用 new RegExp('pattern', 'flags') 时,反斜杠在字符串字面量里本身就是转义字符,所以想表示一个字面意义的 d,得写成 '\d';想表示 u4e00,得写成 '\u4e00'。
比如:
new RegExp('\d{3}-\d{4}', 'g')等价于字面量
/d{3}-d{4}/g。容易踩坑的是路径或 Windows 文件名中的双反斜杠:
'C:\\Users\\name' 才能生成 C:Users
ame 的匹配逻辑。
立即学习“Java免费学习笔记(深入)”;
正则真正难的不是写出一个能跑的表达式,而是写出**不意外匹配、不回溯爆炸、不被用户输入绕过**的那一个。尤其是涉及用户输入的校验(比如邮箱、手机号),别迷信网上抄来的长正则——先想清楚业务边界,再决定要不要用正则,还是交给专门库或分步验证。











