JavaScript正则关键在于转义规则、边界控制和标志选择:中文匹配需覆盖全角符号;replace中$&指整个匹配,$1等指捕获组;^$需加m标志才匹配每行;RegExp构造函数中反斜杠需双写;安全校验应优先考虑业务边界而非复杂正则。
JavaScript 里写正则表达式,关键不是背语法,而是知道**什么时候该转义、什么时候不该、边界怎么控、标志怎么选**。直接上干货。
/[\u4e00-\u9fa5]/ 不够这个常见写法只覆盖基本汉字区,但实际文本中常混有全角逗号、句号、空格(\u3000-\u303f)、平假名/片假名(\u3040-\u309f、\u30a0-\u30ff)等。
更稳妥的中文(含常

/[\u4e00-\u9fa5\u3000-\u303f\u3040-\u309f\u30a0-\u30ff\uff00-\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\nabc\nyyy')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。'C:\\\\Users\\\\name' 才能生成 C:\Users\name 的匹配逻辑。
正则真正难的不是写出一个能跑的表达式,而是写出**不意外匹配、不回溯爆炸、不被用户输入绕过**的那一个。尤其是涉及用户输入的校验(比如邮箱、手机号),别迷信网上抄来的长正则——先想清楚业务边界,再决定要不要用正则,还是交给专门库或分步验证。