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() 时容易出错。
JSON(JavaScript Object Notation) 定义:一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案(有点类似于正则表达式,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换。JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为。有需要的朋友可以下载看看
构造函数创建正则时,字符串转义要翻倍
用 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\name 的匹配逻辑。
立即学习“Java免费学习笔记(深入)”;
正则真正难的不是写出一个能跑的表达式,而是写出**不意外匹配、不回溯爆炸、不被用户输入绕过**的那一个。尤其是涉及用户输入的校验(比如邮箱、手机号),别迷信网上抄来的长正则——先想清楚业务边界,再决定要不要用正则,还是交给专门库或分步验证。










